如何使用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,需要依赖节点
-欢呼
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>
如果您的一些模板将具有属性,那么您还需要为属性提供命名空间。