我的目标是简单地更新简单的站点地图xml文档中的“lastmod”节点: 我想在部署ant脚本中执行此操作,因此我使用Ant任务XMLTask 。 这是我的蚂蚁目标: 不幸的是,我的xpath无法匹配任何东西: 我也尝试了以下xpath查询,没有运气: 但是我发 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
在互联网上,我找到了许多有关如何实现此功能的示例,但是在我看来,这些示例都不起作用。 我有一个包含XML数据的字符串,而且我知道结果的XPath应该是什么样子。 例如,我有一个如下所示的xml结构:
<?xml version="1.0"?>
<m:parent xmlns:m="http://www.somescheme">
<doc:header xmlns:doc="http://www.somescheme">
<doc:documentId>137</doc:documentId>
<doc:documentDescription>Some Description</doc:documentDescription>
<doc:task>
<doc:id>49</doc:id>
<doc:name>Some Name</doc:name>
<doc:description>Some Task Description</doc:description>
<doc:outcome/>
<doc:dueDate/>
<doc:priority>50</doc:priority>
</doc:task>
</doc:header>
<m:otherinfo>234324</m:otherInfo>
</m:parent>
比如说我需要访问和更新otherInfo,那么XPath应该是“ m:parent / m:otherInfo”,我应该能够读取和设置它。 对于doc:outcome,它将是'm:parent / doc:header / doc:task / doc:outcome'。这是我需要在运行时设置的值。
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
new InputSource("data.xml"));
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList nodes = (NodeList) xpath.evaluate("//m:parent/doc:header/doc:task/doc:outcome", doc,
XPathConstants.NODESET);
代码应该像上面一样,但是我没有得到结果,
你能指出我想念的东西吗?
此致Max
您必须另外做两件事,才能使用命名空间评估XPATH表达式。
DocumentBuilderFactory
实例不支持名称空间。 因此,您必须调用setNamespaceAware(true)
。 NamespaceContext
自己的实现,并将其传递给XPath
实例。 这里是一个简单的NamespaceContext
实现,它是一个静态内部类。 此处仅实现getNamespaceURI()
方法。 ( 有关更多详细信息和替代实现,请参阅此IBM developerWorks文章: 将Java语言NamespaceContext对象与XPath结合使用 )
static class MyNamespaceContext implements NamespaceContext {
@Override
public String getNamespaceURI(String prefix) {
if(prefix == null) {
throw new IllegalArgumentException();
} else if(prefix.equals(XMLConstants.DEFAULT_NS_PREFIX)) {
return XMLConstants.NULL_NS_URI;
} else if(prefix.equals(XMLConstants.XML_NS_PREFIX)) {
return XMLConstants.XML_NS_URI;
} else if(prefix.equals(XMLConstants.XMLNS_ATTRIBUTE)) {
return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
} else if(prefix.equals("m")) {
return "http://www.somescheme";
} else if(prefix.equals("doc")) {
return "http://www.somescheme";
} else {
return XMLConstants.NULL_NS_URI;
}
}
@Override
public String getPrefix(String namespaceURI) {
throw new UnsupportedOperationException();
}
@Override
public Iterator getPrefixes(String namespaceURI) {
throw new UnsupportedOperationException();
}
}
这是DocumentBuilderFactory
的一部分:
DocumentBuilderFactory documentBuilderFactory =
DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
Document doc = documentBuilderFactory.newDocumentBuilder().parse(
new InputSource("data.xml"));
XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setNamespaceContext(new MyNamespaceContext());
NodeList nodes = (NodeList) xpath.evaluate(
"//m:parent/doc:header/doc:task/doc:outcome", doc,
XPathConstants.NODESET);
这两个名称空间前缀实际上链接到相同的名称空间URI。 实际上,您只能在XPATH表达式中使用一个前缀,例如"//doc:parent/doc:header/doc:task/doc:outcome"
并且无需在NamespaceContext
实现中声明两者。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.