C# 将XElement合并到XDocument并解析名称空间

C# 将XElement合并到XDocument并解析名称空间,c#,xml,vb.net,linq-to-xml,xelement,C#,Xml,Vb.net,Linq To Xml,Xelement,给定以下XDocument,初始化为变量xDoc: <Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition"> <ReportSection> <Width /> <Page> </ReportSections> </Report> 我想把它作为的孩子。问题是,如果通过XElem

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

<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition">
  <ReportSection>
    <Width />
    <Page>
  </ReportSections>
</Report>
我想把它作为
的孩子。问题是,如果通过
XElement.Parse(body.xml)
添加它,它会保留名称空间,即使我认为名称空间应该被删除(复制它本身没有意义-已经在父级上声明)。如果我不指定名称空间,它将放置一个空名称空间,因此它将成为

是否有方法将
XElement
正确合并到
XDocument
?我希望在
xDoc.Root.Element(“ReportSection”).AddFirst(XElement)
之后获得以下输出:


我不确定为什么会发生这种情况,但是从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);
var report=XDocument.Parse(
@"
");
var body=XElement.Parse(
@"
");
XNamespace ns=report.Root.Name.Namespace;
if(body.GetDefaultNamespace()==ns)
{
属性(“xmlns”).Remove();
}
var节点=report.Root.Element(ns+“ReportSection”);
node.AddFirst(body);

请检查:@Pheonixblade9:不幸的是,在我的例子中,XML不是由代码创建的,正如StackOverflow的几十个示例中所做的那样,包括您提到的示例。从头创建XElement并将其合并到XDocument中不是问题。这是关于XElement的。解析返回一个节点树。非常有趣。实际上,手动删除
xmlns
属性可以使其正常工作。虽然两个选项本应产生相同的效果,但如果不将其置于
主体上,则不起作用。谢谢你把它挖出来+1.
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition">
  <ReportSection>
    <Body>
      <ReportItems />        
      <Height />
      <Style />
    </Body>
    <Width />
    <Page>
  </ReportSections>
</Report>
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);