我有一些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:SomeElementns2:SomeElement等。IMO在可能的情况下,我总是会选择XNamespace,并且与名称空间无关的xpath的用例非常有限,例如用于解析具有未知模式的文档中的特定元素(例如,在服务总线中),或尽力而为地解析名称空间可以更改的文档(例如,将来的证明,其中xmlns更改以匹配文档模式的新版本)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top