将 XElement 合并到 XDocument 并解析命名空间

Posted

技术标签:

【中文标题】将 XElement 合并到 XDocument 并解析命名空间【英文标题】:Merge XElement into XDocument and resolve namespaces 【发布时间】:2012-11-28 20:34:34 【问题描述】:

给定以下XDocument,初始化为变量xDoc

<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition">
  <ReportSection>
    <Width />
    <Page>
  </ReportSections>
</Report>

我有一个嵌入在 XML 文件中的模板(我们称之为body.xml):

<Body xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition">
  <ReportItems />        
  <Height />
  <Style />
</Body>

我想把它作为&lt;ReportSection&gt; 的孩子。问题是如果通过XElement.Parse(body.xml) 添加它,它会保留命名空间,即使我认为应该删除命名空间(复制自身没有意义 - 已经在父级上声明)。如果我不指定命名空间,它会放置一个空的命名空间,所以它变成&lt;Body xmlns=""&gt;

有没有办法将XElement 正确合并到XDocument 中?我想在xDoc.Root.Element("ReportSection").AddFirst(XElement)之后得到以下输出:

<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition">
  <ReportSection>
    <Body>
      <ReportItems />        
      <Height />
      <Style />
    </Body>
    <Width />
    <Page>
  </ReportSections>
</Report>

【问题讨论】:

看看这个:***.com/questions/4985974/xelement-namespaces-how-to @Pheonixblade9:不幸的是,在我的例子中,XML 不是由代码创建的,因为它是在 *** 上的几十个示例中完成的,包括你提到的那个。从头开始创建 XElement 并将其合并到 XDocument 中没有问题。这是关于 XElement.Parse 返回一个节点树。 【参考方案1】:

我不确定为什么会这样,但是从 body 元素中删除 xmlns 属性似乎可行:

var report = XDocument.Parse(
@"<Report xmlns=""http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition"">
  <ReportSection>
    <Width />
    <Page />
  </ReportSection>
</Report>");

var body = XElement.Parse(
@"<Body xmlns=""http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition"">
  <ReportItems />        
  <Height />
  <Style />
</Body>");

XNamespace ns = report.Root.Name.Namespace;
if (body.GetDefaultNamespace() == ns)

   body.Attribute("xmlns").Remove();


var node = report.Root.Element(ns + "ReportSection");
node.AddFirst(body);

【讨论】:

非常有趣。实际上,手动删除 xmlns 属性使其工作。虽然首先没有在body 上使用它是行不通的,尽管这两个选项应该会产生相同的效果。感谢您挖掘它。 +1

以上是关于将 XElement 合并到 XDocument 并解析命名空间的主要内容,如果未能解决你的问题,请参考以下文章

XElement 和 XDocument 有啥区别?

XElement.Load 和 XDocument.Load 有啥区别?

XDocument 在一行中写入特定的 XElement

使用 C# 和 XDocument/XElement 解析 Soap 响应

XElement 和 XDocument 到底有什么区别?

VB.NET:使用 XDocument 在 XML 文件中添加/编辑/删除 XElement