在 Java 中的 XML 文档中按属性查找元素并获取同一元素中另一个属性的值

Find a Element by attribute in a XML Document in Java and get value of another attribute in the same element

我的任务是将我的一些 Python 代码转换为 Java。

原文有很多这样的操作:

name = element.find('*/DIAttribute[@name="ui_display_name"]').attrib['value']

其中元素是 lxml.etree.Element 对象。

在 Java 中,我这样做是为了获得相同的值:

XPath xPath =  XPathFactory.newInstance().newXPath();
NodeList nodesName = (NodeList) xPath.evalute("DIAttribute[@name='ui_display_name']", element, XPathConstants.NODE);
if nodesName.getLength() > 0 {
    Node node = nodesName.item(0);
    name = node.getAttributes().getNamedItem("value");
}

我做的对吗?有更好的方法吗?我正在使用 org.w3c.dom 对象,并且禁止我使用其他 XML 库的权力。

谢谢!

传递 XPathConstants.NODE 不会导致 evaluate 到 return NodeList,它会导致方法 return 单个节点。 class documentation 准确描述了每个 XPathConstant 字段将 returned 的对象类型。

Node node = (Node) xPath.evaluate("DIAttribute[@name='ui_display_name']", element, XPathConstants.NODE);

属性也是文档节点,因此您可以将代码简化为单个 XPath 表达式:

Node node = (Node) xPath.evaluate("DIAttribute[@name='ui_display_name']/@value", element, XPathConstants.NODE);
String name = node.getNodeValue();

因为您只需要节点的字符串值,您可以使用 two-argument evaluate method 代替,省略 XPathConstants 值:

String name = xPath.evaluate("DIAttribute[@name='ui_display_name']/@value", element);

这只会找到 element 的直接子元素的 DIAttribute 元素。如果要搜索 element 以下所有级别的所有 DIAttribute 后代,请在 XPath 表达式中使用 .//

String name = xPath.evaluate(".//DIAttribute[@name='ui_display_name']/@value", element);