我有一个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
答案 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>
如果您的某些模板具有属性,那么您还需要为属性提供命名空间。