任务:我有一个现有的xml文档(UTF-8),它使用xml命名空间和xml模式.我需要解析一个特定的元素,将内容(也需要使用xml名称空间前缀)附加到此元素,然后再次写出Document.
哪个是我应该用于此TASK的最佳XML解析器库?
我见过一个先前的线程(Java的最佳XML解析器),但不确定dom4j或JDOM对于namespaces/xmlSchema是否有用,以及对UTF-8字符的良好支持.
一些解析器似乎是
JDom
Dom4J
XOM
WoodStock 的任务
知道哪一个最好吗?:-)我使用JDK 6,并且不希望使用内置的SAX/DOM工具来完成这项工作,因为这需要我编写太多的代码.
有助于有一些做这样的任务的例子.
使用XSLT.认真.这是一个完美的工作.只需使用复制模板即可复制所有内容,但需要添加更多xml的地方除外.您甚至可以通过实际编写XML而不是DOM操作来添加XML.
这是复制模板:
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
我知道很多人讨厌XSLT,但这是一个真正闪耀并且几乎不需要代码的任务.此外,您可以使用JDK中的内容.
使用JDOM,获取InputStream并使其成为Document:
InputStream inputStream = (InputStream)httpURLConnection.getContent();
DocumentBuilderFactory docbf = DocumentBuilderFactory.newInstance();
docbf.setNamespaceAware(true);
DocumentBuilder docbuilder = docbf.newDocumentBuilder();
Document document = docbuilder.parse(inputStream, baseUrl);
Run Code Online (Sandbox Code Playgroud)
此时,您在Java对象中拥有XML.完成.简单.
您可以使用文档对象和Java API来浏览它,也可以使用XPath,我发现它更容易(一旦我学会了它).
构建一个XPath对象,需要一点:
public static XPath buildXPath() {
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
xpath.setNamespaceContext(new AtomNamespaceContext());
return xpath;
}
public class AtomNamespaceContext implements NamespaceContext {
public String getNamespaceURI(String prefix) {
if (prefix == null)
throw new NullPointerException("Null prefix");
else if ("a".equals(prefix))
return "http://www.w3.org/2005/Atom";
else if ("app".equals(prefix))
return "http://www.w3.org/2007/app";
else if ("os".equals(prefix))
return "http://a9.com/-/spec/opensearch/1.1/";
else if ("x".equals(prefix))
return "http://www.w3.org/1999/xhtml";
else if ("xml".equals(prefix))
return XMLConstants.XML_NS_URI;
return XMLConstants.NULL_NS_URI;
}
// This method isn't necessary for XPath processing.
public String getPrefix(String uri) {
throw new UnsupportedOperationException();
}
// This method isn't necessary for XPath processing either.
public Iterator getPrefixes(String uri) {
throw new UnsupportedOperationException();
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用它,(谢天谢地)并不需要花费太多时间:
return Integer.parseInt(xpath.evaluate("/a:feed/os:totalResults/text()", document));
Run Code Online (Sandbox Code Playgroud)