将元素添加到文档并使用XPath查找

时间:2014-01-21 12:41:44

标签: java xml xpath domdocument

我有使用名称空间感知XPath搜索XML文档(org.w3c.dom)的代码。我在向文档添加元素然后能够通过XPath找到它们时遇到问题。

如果我添加元素并使用XPath搜索,我没有得到任何结果。但是,如果我将Document转换为String并重新分析为Document,则XPath会找到该元素。

我按如下方式创建XPath:

String myXPathQuery = "/ns1:element1/ns2:element2/ns3:element3";
XPathFactory fact = XPathFactory.newInstance();
XPath xpath = fact.newXPath();
xpath.setNamespaceContext(myNSContext);
XPathExpression myXPathExpression = xpath.compile(myXPathQuery);

我按如下方式添加元素:

Document doc = ...;
Element elementToWhichToAdd = ...; // this is "ns2:element2"

Element newElement = doc.createElement("ns3:element3");
elementToWhichToAdd.appendChild(newElement);

如果我针对此文档运行上述XPath,则找不到任何内容。但是,如果我重新解析文档XPath的工作原理。

我错过了什么?

修改

作为更新文档的过程的一部分,如果命名空间不存在(通常不存在),我会添加它。

Element rootElement = doc.getDocumentElement();
NamedNodeMap map = rootElement.getAttributes();
if (map.getNamedItem("xmlns:ns3") == null)
     rootElement.setAttributeNS("http://www.w3.org/2000/xmlns", "xmlns:ns3",
            "urn:exo:/path/to/xsd/in/jar");

1 个答案:

答案 0 :(得分:1)

Element newElement = doc.createElement("ns3:element3");

createElement是一个DOM级别1方法,不支持名称空间 - its JavaDoc表示它返回

  

新的Element对象,nodeName属性设置为tagNamelocalNameprefixnamespaceURI设置为{{ 1}}。

您需要使用DOM级别createElementNS而不是

创建新元素
null

(或者对应于Element newElement = doc.createElementNS("urn:exo:/path/to/xsd/in/jar", "ns3:element3"); 的任何正确的命名空间URI,您可以使用ns3直接从命名空间上下文获取它。