我有使用名称空间感知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");
答案 0 :(得分:1)
Element newElement = doc.createElement("ns3:element3");
createElement
是一个DOM级别1方法,不支持名称空间 - its JavaDoc表示它返回
新的
Element
对象,nodeName
属性设置为tagName
,localName
,prefix
和namespaceURI
设置为{{ 1}}。
您需要使用DOM级别createElementNS
而不是
null
(或者对应于Element newElement = doc.createElementNS("urn:exo:/path/to/xsd/in/jar", "ns3:element3");
的任何正确的命名空间URI,您可以使用ns3
直接从命名空间上下文获取它。