任务:我有一个现有的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工具来完成这项工作,因为这需要我编写太多的代码。
有助于提供一些执行此类任务的示例。
答案 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样式表来做你想做的事。