Xml 如何在没有特定属性的所有元素上使用XPath进行筛选

Xml 如何在没有特定属性的所有元素上使用XPath进行筛选,xml,xpath,Xml,Xpath,我的XPath有点生锈了。。。假设我有一个简单的XML文件: <?xml version="1.0" encoding="utf-8" ?> <States xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <States> <StateProvince name="ALABAMA" abbrev="AL"

我的XPath有点生锈了。。。假设我有一个简单的XML文件:

<?xml version="1.0" encoding="utf-8" ?>
<States xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<States>
<StateProvince name="ALABAMA" abbrev="AL" />
....
<StateProvince name="AMERICAN SAMOA" abbrev="AS" territory="true"  />
</States>
</States>

....
我想运行一个简单的XPath查询来解析所有的真实状态(所以不要拉入territory=true的状态)。我尝试了\StateProvince[@territory!=“true]”但我得到了零分。其他变化似乎正在失败。这看起来应该很简单,但找不到我想要的

非常感谢您的帮助。

您非常接近:

//StateProvince[not(@territory) or @territory != 'true']
应该可以得到您想要的结果。

这应该可以:

//StateProvince[not(@territory='true')]

一个选择所需元素的XPath表达式

/*/States/StateProvince[非(@territory='true')]

请注意必须尽可能避免使用
/
缩写,因为它会导致扫描整个文档(以上下文节点为根的子树)

考虑到最初提供的XML文档的结构,上述XPath表达式避免了使用缩写


只有在XML文档的结构完全未知的情况下(而且XPath表达式打算在许多结构未知的XML文档中使用),才应考虑使用缩写。

特别是如果您是XPath新手,您需要考虑我的解决方案中提出的考虑事项:必须尽可能避免使用//缩写,因为它会导致扫描整个文档(在上下文节点上扎根的子树)。即使对于使用“//”的小型XML文档,也可能会严重影响性能(如果频繁发布这些XPath表达式)。此外,如果一个人习惯于用“//”处理小文档,那么他很有可能会忘记并用它处理大文档,从而造成性能灾难。毕竟,谁来决定小到什么程度才是“小”以及小到什么程度才是“小”?我同意这也是一个很好的做法,但在我的例子中,加载后缓存的只是一个非常小的xml。@lyngbym即使对于使用“//”的小xml文档,也可能会严重影响性能(如果频繁发布这些XPath表达式)。此外,如果一个人习惯于用“//”处理小文档,那么他很有可能会忘记并用它处理大文档,从而造成性能灾难。毕竟,谁来决定“小”有多小,以及“小”在哪里停止?