2

次の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>

の子として入れたい<ReportSection>。問題は、それを介して追加するとXElement.Parse(body.xml)、名前空間を削除する必要があると思いますが、名前空間が保持されることです(それ自体を複製しても意味がありません-親ですでに宣言されています)。名前空間を指定しないと、代わりに空の名前空間が配置されるため、になり<Body xmlns="">ます。

適切にマージする方法はあり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>
4

1 に答える 1

6

なぜこれが起こっているのかわかりませんがxmlns、 body 要素から属性を削除するとうまくいくようです:

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);
于 2012-11-28T21:04:45.930 に答える