在Java中的XML Document中查找Element by属性,并获取同一元素中另一个属性的值

时间:2018-03-27 15:48:16

标签: java python xml lxml

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

在原版中有很多这样的操作:

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

where元素是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库的权力。

谢谢!

1 个答案:

答案 0 :(得分:0)

传递XPathConstants.NODE不会导致evaluate返回NodeList,它会导致该方法返回单个节点。 class documentation准确描述了为每个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();

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

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

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

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