解析XDocument,而不必继续指定默认名称空间
-
29-10-2019 - |
题
我有一些XML数据(类似于下面的示例),我想读取代码中的值。
为什么我不得不指定默认的名称空间来访问每个元素?我希望所有元素都可以使用默认名称空间。
是否有更合理的方法来实现我的目标?
示例XML: 通用标签
读取我所需要的xml元素的代码: 通用标签
解决方案
理论上,文档的含义不受用户对名称空间前缀的选择的影响。只要数据位于名称空间 http://www.secretsonline.gov.uk/secrets,作者选择使用前缀“ s”,“ secrets”,“ _ x.cafe.babe”还是“ null”前缀(即使其成为默认名称空间)都没有关系。您的应用程序不需要在乎:只有URI才是重要的。这就是您的应用程序必须指定URI的原因。
其他提示
根据此答案的建议,您可以通过从文档的内存副本中删除所有名称空间来做到这一点。我想只有在您知道结果文档中不会出现名称冲突的情况下,才应该这样做。 通用标签
您可以使用XmlTextReader.Namespaces 属性可在读取XML文件时禁用名称空间。 通用标签
这是Linq-To-Xml的工作方式。如果找不到默认命名空间中的任何元素,则其后代也是如此。摆脱命名空间最快的方法是从初始XML中删除指向命名空间的链接。
请注意,元素Receipts
也位于命名空间http://www.secretsonline.gov.uk/secrets
中,因此访问该元素也需要XNamespace
:
通用标签
作为使用命名空间的替代方法,请注意,您可以使用local-name()
和namespace-uri()
使用“与命名空间无关”的xpath,例如
通用标签
如果省略了namespace-uri
谓词:
通用标签
将匹配ns1:SomeElement
和ns2:SomeElement
等。IMO在可能的情况下,我总是会选择XNamespace
,并且与名称空间无关的xpath的用例非常有限,例如用于解析具有未知模式的文档中的特定元素(例如,在服务总线中),或尽力而为地解析名称空间可以更改的文档(例如,将来的证明,其中xmlns
更改以匹配文档模式的新版本)