在Java中的XML文档中通过属性找到一个元素,并在同一元素中获取另一个属性的值



我的任务是将我的一些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返回节点符,而是导致返回单个节点的方法。类文档准确地描述了每个XPathConstant字段将返回哪种类型的对象。

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

由于您只需要节点的字符串值,因此可以使用两项评估方法,省略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);

最新更新