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

时间:2010-03-26 13:05:43

标签: java xml parsing

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

这是我应该用于此TASK的最佳XML解析器库吗?

我见过一个前一个帖子(Best XML parser for Java),但不确定dom4j或JDOM对于namespaces / xmlSchema是否有用,并且对UTF-8字符有良好的支持。

一些解析器似乎是一个任务 JDOM
DOM4J
XOM
伍德斯托克

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

有助于提供一些执行此类任务的示例。

4 个答案:

答案 0 :(得分:6)

使用XSLT。认真。这是一个完美的工作。只需使用复制模板即可复制所有内容,但需要添加更多xml的地方除外。您甚至可以通过实际编写XML而不是DOM操作来添加XML。

这是复制模板:

<xsl:template match="node() | @*">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

我知道很多人都讨厌XSLT,但这是一个真正发光并几乎不需要代码的任务。此外,您可以使用JDK中的内容。

答案 1 :(得分:5)

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

此时,您在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));

答案 2 :(得分:2)

由于编写过多代码是您的主要问题,您可能需要考虑jOOX:

http://code.google.com/p/joox/

我已经创建了jOOX作为Java的jQuery端口。底层技术是Java的标准DOM。一些示例代码:

// Find the order at index for and add an element "paid"
$(document).find("orders").children().eq(4)
           .append("<paid>true</paid>");

// Find those orders that are paid and flag them as "settled"
$(document).find("orders").children().find("paid")
           .after("<settled>true</settled>");

// Add a complex element
$(document).find("orders").append(
  $("order", $("date", "2011-08-14"),
             $("amount", "155"),
             $("paid", "false"),
             $("settled", "false")).attr("id", "13");

注意:尚未明确支持命名空间,但您可以解决该问题

答案 3 :(得分:1)

听起来你可以写一个xslt样式表来做你想做的事。