java - 操作/编辑现有 xml 文档的最佳 java XML 解析器

标签 java xml parsing

任务:我有一个现有的 xml 文档 (UTF-8),它使用 xml namespace 和 xml 模式。我需要解析一个特定的元素,将内容(也需要使用 xml 命名空间前缀)附加到这个元素,然后再次写出文档。

哪个是我应该用于此任务的最佳 XML 解析器库?

我看过之前的帖子 ( Best XML parser for Java ),但不确定 dom4j 或 JDOM 是否适合命名空间/xmlSchema 以及对 UTF-8 字符的良好支持。

一些解析器似乎是一项任务
JDom
Dom4J
XOM
伍德斯托克

知道哪一个是最好的吗? :-) 我使用 JDK 6 并且不希望使用内置的 SAX/DOM 工具来完成这项工作,因为这需要我编写太多代码。

有一些执行此类任务的示例会有所帮助。

最佳答案

使用 JDOM,获取一个 InputStream 并使其成为一个文档:

InputStream inputStream = (InputStream)httpURLConnection.getContent();
DocumentBuilderFactory docbf = DocumentBuilderFactory.newInstance();
docbf.setNamespaceAware(true);
DocumentBuilder docbuilder = docbf.newDocumentBuilder();
Document document = docbuilder.parse(inputStream, baseUrl);

到那时,您就拥有了 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();
    }
}

然后直接使用它,(谢天谢地)根本不需要太多时间:

return Integer.parseInt(xpath.evaluate("/a:feed/os:totalResults/text()", document));

关于java - 操作/编辑现有 xml 文档的最佳 java XML 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2523381/

相关文章:

java - 寻找快速方法将格雷码中的 boolean[] 转换为 Java 中的 BigInteger,反之亦然

java - 调试 JMock 期望

java - 带有 TextFormatter 和/或 UnaryOperator 的 JavaFX 8 中用于整数的数字文本字段

xml - 带有 text() 但没有空格的嵌套元素的 XPath

Scala PackratParser 忽略失败解析器

java - MVC 和 Java GUI 监听器

c# - 检查节点是否存在于 XDocument 中

java - 抽屉无法识别布局

java - 以秒为单位的时差给了我错误的答案

ios - 在 Swift 中解析 JSON 数据