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

本文关键字:xml 节点 文件 linq 何使用 代码 加载 | 更新日期: 2023-09-27 18:21:55

我有一个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,需要依赖节点

-欢呼

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

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>

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