为什么在使用XDocument.Parse()时会向元素添加名称空间前缀,以及如何抑制它们?

时间:2016-03-11 16:32:07

标签: c# xml linq

当我尝试解析以下xml字符串

       string input = 
           @"<root xmlns=""urn:hl7-org:v3"" xmlns:abc=""urn:hl7-org:v3"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:schemaLocation=""urn:hl7-org:v3 http://xreg2.nist.gov:8080/hitspValidation/schema/cdar2c32/infrastructure/cda/C32_CDA.xsd"" xmlns:sdtc=""urn:hl7-org:sdtc"" >" +
           @"<realmCode code=""US"" />" +
           @"<typeId root=""2"" extension=""P"" />" +
           @"<templateId root=""1"" />" +
           @"<id root=""21"" extension=""273"" />" +
           @"</root >";

使用System.Xml.Linq.XDocument如下

XDocument _xmlObject = XDocument.Parse(input, LoadOptions.PreserveWhitespace);

我的所有代码都会像这样加上前缀

<abc:root xmlns="urn:hl7-org:v3" xmlns:abc="urn:hl7-org:v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 http://xreg2.nist.gov:8080/hitspValidation/schema/cdar2c32/infrastructure/cda/C32_CDA.xsd" xmlns:sdtc="urn:hl7-org:sdtc">
<abc:realmCode code="US" />
  <abc:typeId root="2" extension="P" />
  <abc:templateId root="1" />
  <abc:id root="21" extension="273" />
</abc:root>

为什么解析器会这样做?我没有看到Parse方法有任何选项可以抑制这些。有办法吗?

2 个答案:

答案 0 :(得分:1)

在我看来,您看到的结果是由于LINQ to XML对象模型的缺点,它不存储节点的限定名称的前缀,而是仅存储本地名称和名称空间URI并尝试从任何范围内的命名空间声明中推断出前缀。在您的示例中,名称空间urn:hl7-org:v3有两个名称空间声明,默认名称空间声明xmlns="urn:hl7-org:v3"和前缀xmlns:abc="urn:hl7-org:v3"的名称空间声明。这是完全正确的,并且由XML和XML命名空间规范允许,但它留下前缀推断的选择,在您的情况下不会反映输入中的前缀。我不认为有使用LINQ to XML的方法(除了改变命名空间声明的顺序,并希望推断将始终依赖于它),DOM实现(System.Xml.XmlNode/XmlElement/XmlDocument)是一个对象模型它存储限定名称的前缀并保留输入前缀。但它有一个API,它不像C ++那样集成到LINQ to XML中。

答案 1 :(得分:0)

很可能你的编译器看到xmlns:abc =“”urn:hl7-org:v3“”然后它将这个前缀添加到XML元素。您可能需要删除此代码的片段。我在编译器中检查了你的问题。