我有一个包含许多不同节点的xml文件。特别是有些嵌套如下:
<emailAddresses>
<emailAddress>
<value>[email protected]</value>
<typeSource>WORK</typeSource>
<typeUser></typeUser>
<primary>false</primary>
</emailAddress>
<emailAddress>
<value>[email protected]</value>
<typeSource>HOME</typeSource>
<typeUser></typeUser>
<primary>true</primary>
</emailAddress>
</emailAddresses>
从上面的节点,我想做的是遍历每个节点并获取其中的值(值,typeSource,typeUser等),并将其放入POJO中。
我试图查看我是否可以使用此xpath表达式
"//emailAddress"
,但它不会向我返回其中的标签。也许我做错了。我是使用xpath的新手。我可以做这样的事情:
//emailAddress/value | //emailAddress/typeSource | ..
,但是这样做可以将所有元素值一起列出,如果我没弄错的话,当我从特定的emailAddress标记中读取完并转到下一个emailAddress标记时,我可以进行计算。很好地总结我的需求,我基本上希望返回的结果类似于您从沼泽标准sql查询中返回结果的方式,该查询连续返回结果。即,如果您的sql查询产生10个emailAddress,它将连续返回每个emailAddress,而我可以简单地遍历“每个emailAddress”并根据列名或索引获取适当的值。
最佳答案
没有,
//电子邮件地址
没有返回标签,这是正确的。它返回的是NodeList / NodeSet。要实际获取值,您可以执行以下操作:
String emailpath = "//emailAddress";
String emailvalue = ".//value";
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xpath = xPathFactory.newXPath();
Document document;
public XpathStuff(String file) throws ParserConfigurationException, IOException, SAXException {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = docFactory.newDocumentBuilder();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
document = builder.parse(bis);
NodeList nodeList = getNodeList(document, emailpath);
for(int i = 0; i < nodeList.getLength(); i++){
System.out.println(getValue(nodeList.item(i), emailvalue));
}
bis.close();
}
public NodeList getNodeList(Document doc, String expr) {
try {
XPathExpression pathExpr = xpath.compile(expr);
return (NodeList) pathExpr.evaluate(doc, XPathConstants.NODESET);
} catch (XPathExpressionException e) {
e.printStackTrace();
}
return null;
}
//extracts the String value for the given expression
private String getValue(Node n, String expr) {
try {
XPathExpression pathExpr = xpath.compile(expr);
return (String) pathExpr.evaluate(n,
XPathConstants.STRING);
} catch (XPathExpressionException e) {
e.printStackTrace();
}
return null;
}
也许我应该指出,当遍历Nodelist时,在.//values中,第一个点表示当前上下文。没有点,您将始终获得第一个节点。