我想检查是否存在属性id,以及该示例xml文件是否为空:
<component
id="http://../EDYRA/prototype/TextEditor"
isUI="true"
name="TextEditor"
version="0.1">
<binding>
<dependencies>
<dependency language="javascript">
<url>https://../TextEditor.js</url>
</dependency>
</dependencies>
<constructor>
<code>new TextEditor();</code>
</constructor>
</binding>
</component>
我用Java编写了这个XPath查询:
XPathExpression expr = xpath.compile("//component[@id]/@id/text()");
Object result = expr.evaluate(file, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
resultsString += "Expression: //component[@id]/@id/text();
resultsString += " \r\nNode List: " + result.toString() + " \r\n Item: ";
resultsString += nodes.item(0) + " \r\n Length: ";
resultsString += nodes.getLength() + " \r\n\r\n\r\n";
file.getDocumentElement();
resultsString += "Attribute ->" + " : " + file.getDocumentElement().getAttribute("id");
我测试了它,不幸的是它返回了包含0项的列表:
Expression:// component [@id] / @ id / text()
节点列表:com.sun.org.apache.xml.internal.dtm.ref.DTMNodeList@4fe3c938
项目:null
长度:0
属性 - &gt; http://../EDYRA/prototype/TextEditor
如何查看正确的查询以检查此属性是否存在并获取此属性的值?
编辑:
// component [@id]也不会返回任何结果。看起来每个查询都没有返回任何内容......
答案 0 :(得分:2)
O(1)
属性不能包含子节点,但在上面的表达式中,您要选择任何所选int i = 0;
属性的所有文本节点子节点。这个不正确的表达式将始终选择零节点。
一个XPath表达式选择XML文档中所有//component[@id]/@id/text()
元素的所有id
属性(有值):
id
如果您将仅限空格的值视为&#34;空&#34;也可以使用这个XPath表达式:
component
答案 1 :(得分:1)
除了省略text()访问权限外,您还不需要两次访问@id。表达式//component/@id
恰好等同于//component[@id]/@id
- 它将返回具有此类属性的所有组件的@id属性。
如果您想仅在非空时返回@id属性,请尝试//component/@id[string()]
。
如果//component/@id
没有返回任何内容,那么还有其他事情你还没有告诉我们 - 也许组件元素在命名空间中?