如何使用linq将xml代码块加载到特定节点的现有xml文件中

时间:2013-07-11 16:11:53

标签: c# xml linq linq-to-xml

我有一个xml模板(ReportTemplate.xml),其中包含以下内容:

<Report xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns:cl="http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition" xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition">
  <ReportSections>
    <ReportSection>
      <Body>
        <ReportItems>
          <Tablix Name="Tablix1">
            <TablixBody>
              <TablixColumns>

              </TablixColumns>
              <TablixRows>

              </TablixRows>
            </TablixBody>
          </Tablix>
        </ReportItems>
      </Body>
    </ReportSection>
  </ReportSections>
</Report>

我已经创建了xml片段(tablixrow.xml),而不是完全限定的xml文档

<TablixRow>
  <Height>0.26736in</Height>
</TablixRow>

在我的控制台应用程序中,我正在尝试加载两个文件并将tablixrow代码块插入父文档的TablixRows节点

 private static XDocument GenerateReport(List<string>fieldnames)
        {           
            //load base template
            XDocument report = XDocument.Load("Templates/ReportTemplate.xml");
            XNamespace ns = report.Root.Name.Namespace;
            //load row template
            XDocument tRows = XDocument.Load("Templates/tablixrow.xml");
             //and here is where I am stuck


            return report;
        }

我是linq的新手,我正在尝试了解如何导航到“TablixRows”节点,然后插入tRows代码块。

任何人都可以提供一些参考点或示例。到目前为止我所看到的总是导航到ID。我不能在这个模式中使用id,需要依赖节点

-cheers

1 个答案:

答案 0 :(得分:0)

private static XDocument GenerateReport(List<string>fieldnames)
{
    XDocument report = XDocument.Load("Templates/ReportTemplate.xml");
    XNamespace ns = report.Root.Name.Namespace;
    XElement row = XElement.Load("Templates/tablixrow.xml");

    // change namespace for loaded xml elements
    foreach (var element in row.DescendantsAndSelf())
        element.Name = ns + element.Name.LocalName;

    var rows = xdoc.Descendants(ns + "TablixRows").Single();
    rows.Add(row);

    return report;
}

如果您不更改行模板xml的命名空间,那么在添加到报表文档后,它将具有默认命名空间(您不需要):

<TablixRows>
  <TablixRow xmlns="">
    <Height>0.26736in</Height>
  </TablixRow>
</TablixRows>

如果您的某些模板具有属性,那么您还需要为属性提供命名空间。