我的同事为有效负载中的每个元素提供了一个命名空间
ns0
以实现最佳实践,但我的解析器停止工作。阅读有关该主题的更多内容,似乎没有必要为每个元素声明名称空间;可以在root下设置吗?
当您在 XML 文档中使用多个命名空间时,您可以定义 将一个命名空间作为默认命名空间,以创建更简洁的外观 文档。默认命名空间在根元素中声明,并且 适用于文档中所有不合格的元素。默认 命名空间仅适用于元素,不适用于属性。
来源:https://learn.microsoft.com/en-us/dotnet/standard/data/xml/managing-namespaces-in-an-xml-document
正确的做法是什么?
<ns0:Root
xmlns:ns0="urn:asw:erT"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:urn="urn:asw:erT">
<ns0:Ticket
xmlns:urn="urn:asw:erT" Code="TEST" Key="1">
<ns0:client>
<ns0:CardNumber>12345</ns0:CardNumber>
<ns0:OpenPointsBalance>14352</ns0:OpenPointsBalance>
<ns0:PointsEarnedValue>46</ns0:PointsEarnedValue>
<ns0:PointsClosingBalance>14398</ns0:PointsClosingBalance>
</ns0:client>
</ns0:Ticket>
</ns0:Root>
正确的做法是什么?
两者都不比另一个更正确。
您发布的 XML 带有用于
"urn:asw:erT"
命名空间的显式命名空间前缀,
<ns0:Root
xmlns:ns0="urn:asw:erT"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:urn="urn:asw:erT">
<ns0:Ticket
xmlns:urn="urn:asw:erT" Code="TEST" Key="1">
<ns0:client>
<ns0:CardNumber>12345</ns0:CardNumber>
<ns0:OpenPointsBalance>14352</ns0:OpenPointsBalance>
<ns0:PointsEarnedValue>46</ns0:PointsEarnedValue>
<ns0:PointsClosingBalance>14398</ns0:PointsClosingBalance>
</ns0:client>
</ns0:Ticket>
</ns0:Root>
完全等同于以下带有
"urn:asw:erT"
默认命名空间的 XML:
<Root
xmlns="urn:asw:erT"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:urn="urn:asw:erT">
<Ticket Code="TEST" Key="1">
<client>
<CardNumber>12345</CardNumber>
<OpenPointsBalance>14352</OpenPointsBalance>
<PointsEarnedValue>46</PointsEarnedValue>
<PointsClosingBalance>14398</PointsClosingBalance>
</client>
</Ticket>
</Root>
任何符合规范的 XML 处理器或应用程序都不应以与 XML 文档 2 不同的方式对待 XML 文档 1。
我的同事为有效负载中的每个元素提供了一个命名空间
以实现最佳实践ns0
为每个元素使用名称空间前缀很好,但对于这是“最佳实践”并没有达成共识。
...我的解析器停止工作
如果您的解析器对 XML Document 1 和 XML Document 2 之间的差异很敏感,那么您的解析器就会损坏。