【问题标题】:xml multiple namespaces in rootxml 根目录下的多个命名空间
【发布时间】:2013-03-08 17:03:37
【问题描述】:

我无法生成 xml 根目录。我必须匹配这个结构,因为 xml 的元素始终使用前缀。

<ShipmentReceiptNotification
xmlns="urn:rosettanet:specification:interchange:ShipmentReceiptNotification:xsd:schema:02.02"
xmlns:dacc="urn:rosettanet:specification:domain:Procurement:AccountClassification:xsd:codelist:01.03"
xmlns:dbpq="urn:rosettanet:specification:domain:Procurement:BookPriceQualifier:xsd:codelist:01.04"
xmlns:dccc="urn:rosettanet:specification:domain:Procurement:CreditCardClassification:xsd:codelist:01.03"
xmlns:dcrt="urn:rosettanet:specification:domain:Procurement:CustomerType:xsd:codelist:01.03"
..\..\XML\Interchange\ShipmentReceiptNotification_02_02.xsd">

如果我做类似的事情

XmlNode ShipmentReceiptNotification0Node = xmlDoc.CreateElement("ShipmentReceiptNotification", "xmlns=\"urn:rosettanet:specification:interchange:ShipmentReceiptNotification:xsd:schema:02.02\"xmlns:dacc=\"urn:rosettanet:specification:domain:Procurement:AccountClassification:xsd:codelist:01.03\"");

我明白了

-ShipmentReceiptNotification xmlns="xmlns="urn:rosettanet:specification:interchange:ShipmentReceiptNotification:xsd:schema:02.02"xmlns:dacc=&

quot;urn:rosettanet:specification:domain:Procurement:AccountClassification:xsd:codelist:01.03"">

【问题讨论】:

  • 命名空间是xmlns="之后的部分。例如,它只是urn:rosettanet:specification:interchange:ShipmentReceiptNotification:xsd:schema:02.02。另外,不要担心将它们全部放在根目录中。只需在正确的命名空间中创建正确的元素和属性。此外,您会发现 LINQ to XML 更容易。

标签: c# xml namespaces


【解决方案1】:

CreateElement 的第二个参数接受 正在创建的元素(即ShipmentReceiptNotification)所属的命名空间的 URI。不是所有xmlns 属性。这段代码:

XmlElement e = xmlDoc.CreateElement(
    "ShipmentReceiptNotification",
    "urn:rosettanet:specification:interchange:ShipmentReceiptNotification:xsd:schema:02.02");

生成此 XML:

<ShipmentReceiptNotification 
    xmlns="urn:rosettanet:specification:interchange:ShipmentReceiptNotification:xsd:schema:02.02" />

要产生你想要的东西,你需要向元素添加属性。像这样:

XmlElement e = xmlDoc.CreateElement("ShipmentReceiptNotification");
e.SetAttribute("xmlns", "urn:rosettanet:specification:interchange:ShipmentReceiptNotification:xsd:schema:02.02");
e.SetAttribute("xmlns:dacc", "urn:rosettanet:specification:domain:Procurement:AccountClassification:xsd:codelist:01.03");

生成此 XML:

<ShipmentReceiptNotification 
    xmlns="urn:rosettanet:specification:interchange:ShipmentReceiptNotification:xsd:schema:02.02" 
    xmlns:dacc="urn:rosettanet:specification:domain:Procurement:AccountClassification:xsd:codelist:01.03" />

请注意,这是“手动”方式。您应该使用XmlNamespaceManager 来“正确”地做到这一点。但是,这可能是一个更复杂的任务,您的场景不需要。

【讨论】:

  • 我相信我需要使用 xmlnamespacemanager,因为我可以添加所有属性,但是当我创建带有前缀的元素时,属性中定义的前缀不会显示在结尾的 xmldocument 中。
  • 是的。请不要惊讶 XmlDocument 不会在任何地方接受任何 XmlNamespaceManager 实例;他们都只是共享同一个XmlNameTable 实例。
  • 我必须使用 xelement 吗?
  • 在最新版本的 .NET 中有两个并行的 XML 库:XmlDocument 等。和XDocument 等。后者更新,并且启用了 LINQ。使用哪一个取决于您的用例,也取决于您是否已经有大量代码使用其中一个或另一个。
  • 我更愿意坚持使用 xmldocument,但我无法为以后的元素获取任何前缀以使用根节点命名空间的属性方法
猜你喜欢
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 2017-07-19
相关资源
最近更新 更多