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);

取决于预期找到多少个节点。