我的任务是将我的一些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库的权力。
谢谢!
答案 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);