在 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);
我的任务是将我的一些 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);