检查节点是否只存在一个属性,并在XPAth中返回该属性的值

时间:2016-04-23 17:47:18

标签: java xml xpath

我想检查是否存在属性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]也不会返回任何结果。看起来每个查询都没有返回任何内容......

2 个答案:

答案 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没有返回任何内容,那么还有其他事情你还没有告诉我们 - 也许组件元素在命名空间中?