首页 > 解决方案 > 将 XElement 添加到具有相同命名空间的 XDocument

问题描述

我有一个具有以下结构的 XDocument,我想在其中添加一堆 XElement。

<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
  <CstmrCdtTrfInitn>
    <GrpHdr>
     ...
    </GrpHdr>
    <!-- loaded nodes go here -->
  <CstmrCdtTrfInitn>
</Document>

XElement 具有以下结构:

<PmtInf xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
...
</PmtInf>

问题是接收方不支持子节点中的命名空间,因为它与 XDocument 的命名空间相同 - 它是多余的。如何避免/删除子节点上的命名空间?

我现在使用的代码:

var childNodes = new XElement(NameSpace + "GrpHdr", ...);
XElement[] loadedNodes = ...;//Loads from a service using XElement.Load
var content = new XElement(NameSpace + "CstmrCdtTrfInitn", childNodes,loadedNodes));

标签: c#xml

解决方案


当调用orSave时,有一个标志枚举允许您在一定程度上控制文档如何写入 XML。XElementXDocumentSaveOptions

实现您想要的最简单的方法(无需遍历结构以删除冗余属性)是使用以下标志之一:OmitDuplicateNamespaces.

序列化时删除重复的命名空间声明。

您可以在此小提琴中看到,添加此标志会更改我的示例输出:

<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
  <CstmrCdtTrfInitn>
    <GrpHdr />
    <PmtInf xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">...</PmtInf>
  </CstmrCdtTrfInitn>
</Document>

对此:

<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
  <CstmrCdtTrfInitn>
    <GrpHdr />
    <PmtInf>...</PmtInf>
  </CstmrCdtTrfInitn>
</Document>

推荐阅读