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

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

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

我已经看过一个先前的线程( Java的最佳XML解析器 ),但不确定dom4j或JDOM对于namespaces / xmlSchema是否有用,以及对UTF-8字符的良好支持。

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

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

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

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

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

这是复制模板:

      

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

由于编写太多代码是您的主要问题,您可能需要考虑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("true"); // Find those orders that are paid and flag them as "settled" $(document).find("orders").children().find("paid") .after("true"); // Add a complex element $(document).find("orders").append( $("order", $("date", "2011-08-14"), $("amount", "155"), $("paid", "false"), $("settled", "false")).attr("id", "13"); 

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

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