我在服务器上发布了一些csv输入文件,它给了我一个如下所示的xml文件:
<ns0:TransportationEvent xmlns:ns0="http://www.server.com/schemas/TransportationEvent.xsd">
<ns0:deviceId>4567289456</ns0:deviceId>
.....
.....
</ns0:TransportationEvent>
<ns0:TransportationEvent xmlns:ns0="http://www.server.com/schemas/TransportationEvent.xsd">
<ns0:deviceId>7965145741</ns0:deviceId>
.....
.....
</ns0:TransportationEvent>
<ns0:TransportationEvent xmlns:ns0="http://www.server.com/schemas/TransportationEvent.xsd">
<ns0:deviceId>2168744654</ns0:deviceId>
.....
.....
</ns0:TransportationEvent>
TransportationEvent 标记将一次又一次地添加,其中包含更新的deviceId。
我正在使用XpathFactory类和NamespaceContext类从这个xml中检索数据,如下所示:
NamespaceContext ctx = new NamespaceContext() {
public String getNamespaceURI(String prefix) {
String uri;
if (prefix.equals("ns0"))
uri = "http://www.server.com/schemas/TransportationEvent.xsd";
else
uri = null;
return uri;
}
public Iterator getPrefixes(String val) {
return null;
}
// Dummy implementation - not used!
public String getPrefix(String uri) {
return null;
}
};
XPathFactory xpathFact = XPathFactory.newInstance();
XPath xpath = xpathFact.newXPath();
xpath.setNamespaceContext(ctx);
String strXpath = "//ns0:TransportationEvent/ns0:deviceId/text()";
String deviceId = xpath.evaluate(strXpath, doc);
上述代码将 deviceId 的值设为 4567289456 。基本上它始终采用第一个 TransportationEvent 标记的值。
我需要从“ TransportationEvent ”标记中选择数据,其中“ deviceId ”等于我选择的deviceId。像这样:
String strXpath = "//ns0:TransportationEvent[where ns0:deviceId = " + myDeviceId + "]/ns0:deviceId/text()";
我可以通过使用NodeList类来执行此操作,并且可以遍历所有“ TransportationEvent ”标记,但之后我将无法使用Xpath或NamespaceContext实现。我发现NodeList类和NamespaceContext类或Xpath类之间没有任何关联。
我希望得到 ctx 的值,其中包含所需 TransportationEvent 标记的上下文。
我知道我错过了什么。有人可以帮忙吗?
答案 0 :(得分:0)
您可以像这样获取您感兴趣的deviceId的父节点:
//ns0:deviceId[text()='7965145741']/parent::node()
private static final String NS0_NS = "http://www.server.com/schemas/TransportationEvent.xsd";
private static final String NS0 = "ns0";
private static final List<String> prefixes = Arrays.asList(NS0);
public void fromDocument(Document doc) throws XPathExpressionException, TransformerConfigurationException,
TransformerFactoryConfigurationError, TransformerException {
XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setNamespaceContext(new NamespaceContext() {
@Override
public Iterator getPrefixes(String namespaceURI) {
return prefixes.iterator();
}
@Override
public String getPrefix(String namespaceURI) {
String res = namespaceURI.equals(NS0_NS)?NS0:null;
return res;
}
@Override
public String getNamespaceURI(String prefix) {
String res = prefix.equals(NS0)?NS0_NS:null;
return res;
}
});
XPathExpression devex = xpath.compile("//ns0:deviceId[text()='7965145741']/parent::node()");
Node node = (Node) devex.evaluate(doc,XPathConstants.NODE);
Transformer xformer = TransformerFactory.newInstance().newTransformer();
xformer.transform(new DOMSource(node),new StreamResult(System.out));
}
输出:
<ns0:TransportationEvent xmlns:ns0="http://www.server.com/schemas/TransportationEvent.xsd">
<ns0:deviceId>7965145741</ns0:deviceId>
</ns0:TransportationEvent>