Xpath 检索 java 中节点的属性
Xpath retrieve the attribute of the node in java
我想检索具有属性的字段,但这不起作用。
这是我的 xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<fields>
<field name="a" class="b" libelle="zozo"></field>
<field name="c" class="c" libelle="zaza"></field>
</fields>
Xpath 表达式:
//field[@name[.='a'] and @class[.='b']]
Java代码:
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String args[]) throws Exception {
String fileName = Main.class.getResource("exemple.xml").getFile();
Document document = getDocument(fileName);
System.out.println(evaluateXPath(document, "//field[@name='a' and @class='b']")); //updated with the proposition of @Michael
System.out.println(evaluateXPath(document, "//field/@name[.='a']")); //to show you that the parser work a bit
}
private static Document getDocument(String fileName) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(fileName);
return doc;
}
private static List<String> evaluateXPath(Document document, String xpathExpression){
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
List<String> values = new ArrayList<>();
try {
XPathExpression expr = xpath.compile(xpathExpression);
NodeList nodes = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
if (nodes != null)
for (int i = 0; i < nodes.getLength(); i++) {
if (nodes.item(i).getNodeValue() != null)
values.add(nodes.item(i).getNodeValue());
}
} catch (XPathExpressionException e) {
e.printStackTrace();
}
return values;
}
}
通过这个设置,我希望得到
<field name="a" class="b" libelle="zozo">
但我什么也没得到。
我尝试使用在线 Xpath 验证器,它有效但在 Java..
中无效
我看到它可能来自 xml 中的命名空间,但我的 none 中有。
感谢您的帮助
解决方案
正如@Alexandra 在下面所说,我使用的方法在我的情况下 return 为 null。
为了从您必须使用的属性中检索值:
nodes.item(0).getAttributes().getNamedItem("YourAttributeName");
尝试将 XPath 求值更改为
NodeList nodes = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
或到
Node node = (Node) expr.evaluate(document, XPathConstants.NODE);
取决于预期找到多少个节点。
我想检索具有属性的字段,但这不起作用。
这是我的 xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<fields>
<field name="a" class="b" libelle="zozo"></field>
<field name="c" class="c" libelle="zaza"></field>
</fields>
Xpath 表达式:
//field[@name[.='a'] and @class[.='b']]
Java代码:
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String args[]) throws Exception {
String fileName = Main.class.getResource("exemple.xml").getFile();
Document document = getDocument(fileName);
System.out.println(evaluateXPath(document, "//field[@name='a' and @class='b']")); //updated with the proposition of @Michael
System.out.println(evaluateXPath(document, "//field/@name[.='a']")); //to show you that the parser work a bit
}
private static Document getDocument(String fileName) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(fileName);
return doc;
}
private static List<String> evaluateXPath(Document document, String xpathExpression){
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
List<String> values = new ArrayList<>();
try {
XPathExpression expr = xpath.compile(xpathExpression);
NodeList nodes = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
if (nodes != null)
for (int i = 0; i < nodes.getLength(); i++) {
if (nodes.item(i).getNodeValue() != null)
values.add(nodes.item(i).getNodeValue());
}
} catch (XPathExpressionException e) {
e.printStackTrace();
}
return values;
}
}
通过这个设置,我希望得到
<field name="a" class="b" libelle="zozo">
但我什么也没得到。 我尝试使用在线 Xpath 验证器,它有效但在 Java..
中无效我看到它可能来自 xml 中的命名空间,但我的 none 中有。
感谢您的帮助
解决方案
正如@Alexandra 在下面所说,我使用的方法在我的情况下 return 为 null。
为了从您必须使用的属性中检索值:
nodes.item(0).getAttributes().getNamedItem("YourAttributeName");
尝试将 XPath 求值更改为
NodeList nodes = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
或到
Node node = (Node) expr.evaluate(document, XPathConstants.NODE);
取决于预期找到多少个节点。