如何使用Java中的XPath检查节点是否具有一个或多个特定属性?

如何使用Java中的XPath检查节点是否具有一个或多个特定属性?,java,xml,xpath,Java,Xml,Xpath,我想得到每个包含以下属性之一的子节点:type、ref、base。每个属性的值都不重要,我只想检查属性是否存在 我现在就是这样做的: private void addRequiredNodeAndChildren(Node n) { XPath xpath = XPathFactory.newInstance().newXPath(); String expression = "*//*[@base or @ref or @type]";

我想得到每个包含以下属性之一的子节点:type、ref、base。每个属性的值都不重要,我只想检查属性是否存在

我现在就是这样做的:

private void addRequiredNodeAndChildren(Node n) {    
            XPath xpath = XPathFactory.newInstance().newXPath();
            String expression = "*//*[@base or @ref or @type]";
            XPathExpression expr = xpath.compile(expression);
            NodeList referList = (NodeList) expr.evaluate(n, XPathConstants.NODESET);
            ..
}
此表达式工作正常,但在一种情况下,我没有得到所有预期的节点:

 <xs:complexType name="ListElement">
        <xs:annotation>
            <xs:documentation>
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="transferMode" type="myprefix:dataTransferMode"
            use="optional">
            <xs:annotation>
                <xs:documentation>Documentation for attribute
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>
也没有帮助,因此我从XML中获取了每个节点,其中包含一个属性,但我只想获取给定节点n的子节点。我也试过了

*//*[@base] or *//*[@ref] or *//*[@type]
作为一种表达,但效果并不理想

有人知道如何解决我的问题吗

//*[@base或@ref或@type] 也没有帮助,因此我从XML中获取了每个节点,其中包含一个属性,但我只想获取给定节点n的子节点

这是因为“/”搜索整个文档。谓词是正确的,但筛选的序列是错误的。要获取上下文节点的子节点,请使用

*[@base or @ref or @type]

顺便说一句,如果您试图列出XSD中包含引用架构中其他声明的QName的所有属性,那么您的列表是不完整的。

似乎您想要的是:

*[descendant-or-self::*[@base or @ref or @type] ]

谢谢大家的帮助

我找到了一个不太漂亮的解决方案,但至少它是有效的:

*[@base or @ref or @type] | *//*[@base or @ref or @type]
编辑:我采用了解决方案,这也解决了问题:

descendant-or-self::*[@base or @ref or @type]

xpath前面的*是不需要的,也没有什么区别,但是作为xpath,它工作得很好,假设定义了名称空间xs和myprefix。想必你的文档中还有其他有用的东西?“仅给定节点n的子节点”是什么意思?你的意思是你得到了注解?对于属性?的子文档Documentation,前缀已定义,并且在文档中的任何其他位置,此解决方案都可以正常工作。对于给定节点n的子节点,我的意思是我只想在xs:annotation节点和xs:attribute节点中查找属性。您不能确切地说您没有选择想要的节点。请澄清。感谢您的快速回复,但编辑序列并没有解决我的问题,使用此过滤器,其他节点也被忽略。。。哪些其他属性可以用来引用其他声明?我已经说过,如果我设计应用程序,我不会这样做,所以我不认为我会引导你走我自己不会走的路。处理架构文档很困难。谢谢您的建议,但这个表达式也没有解决我的问题。我将您的解决方案更改为后代或self:*[@base或@ref或@type],效果很好
descendant-or-self::*[@base or @ref or @type]