最好的java Xml解析器来操作/编辑现有的xml文档

anj*_*anb 7 java xml parsing

任务:我有一个现有的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工具来完成这项工作,因为这需要我编写太多的代码.

有助于有一些做这样的任务的例子.

Rus*_*ett 6

使用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中的内容.


Dea*_*n J 6

使用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)