/* * Copyright (c) 2002-2012 Alibaba Group Holding Limited. * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.citrus.dev.handler.util; import static com.alibaba.citrus.util.StringUtil.*; import java.io.IOException; import java.net.URL; import java.util.BitSet; import com.alibaba.citrus.springext.support.SchemaUtil; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Namespace; public class DomUtil { private final static BitSet bs; static { bs = new BitSet(); // 根据<a href="http://www.w3.org/TR/REC-xml/#id">http://www.w3.org/TR/REC-xml/#id</a>所指示的标准,将非id字符转成_。 bs.set(':'); bs.set('-'); bs.set('.'); bs.set('_'); bs.set('0', '9'); bs.set('A', 'Z'); bs.set('a', 'z'); bs.set('\u00C0', '\u00D6'); bs.set('\u00D8', '\u00F6'); bs.set('\u00F8', '\u02FF'); bs.set('\u0370', '\u037D'); bs.set('\u037F', '\u1FFF'); bs.set('\u200C', '\u200D'); bs.set('\u2070', '\u218F'); bs.set('\u2C00', '\u2FEF'); bs.set('\u3001', '\uD7FF'); bs.set('\uF900', '\uFDCF'); bs.set('\uFDF0', '\uFFFD'); bs.set('\u00B7'); bs.set('\u0300', '\u036F'); bs.set('\u203F', '\u2040'); } public static String toId(String name) { if (name != null) { StringBuilder buf = new StringBuilder(name.length()); for (int i = 0; i < name.length(); i++) { char c = name.charAt(i); if (!bs.get(c)) { c = '_'; } buf.append(c); } name = buf.toString(); } return name; } /** 读取xml文件,转换成dom。 */ public static Element readDocument(String name, URL url, ElementFilter filter) throws Exception, IOException { Document doc = SchemaUtil.readDocument(url.openStream(), name, true); org.dom4j.Element dom4jRootElement = doc.getRootElement(); return copy(dom4jRootElement, filter); } private static Element copy(org.dom4j.Element dom4jElement, ElementFilter filter) throws Exception { dom4jElement = filter.filter(dom4jElement); if (dom4jElement == null) { return null; } Element element = new Element(dom4jElement.getQualifiedName(), dom4jElement.getNamespaceURI()); for (Object attr : dom4jElement.attributes()) { String name = ((Attribute) attr).getQualifiedName(); String value = ((Attribute) attr).getValue(); element.addAttribute(name, value); } for (Object ns : dom4jElement.declaredNamespaces()) { String name = ((Namespace) ns).getPrefix(); String value = ((Namespace) ns).getURI(); if (isEmpty(name)) { name = "xmlns"; } else { name = "xmlns:" + name; } element.addAttribute(name, value); } for (Object e : dom4jElement.elements()) { Element subElement = copy((org.dom4j.Element) e, filter); if (subElement != null) { element.addSubElement(subElement); } } if (dom4jElement.elements().isEmpty()) { String text = trimToNull(dom4jElement.getText()); if (text != null) { element.setText(text); } } return element; } public interface ElementFilter { org.dom4j.Element filter(org.dom4j.Element e) throws Exception; } }