5

我有 C# 程序为报告服务中的显示报告生成 RDL 文件。我使用 Linq to Xml 生成 Xml。

当我尝试将xmlns XAttribute 添加到报表元素时,我遇到了几个问题。

我测试以下方法:

第一的:

        XDocument d = new XDocument(
           new XDeclaration("1.0", "utf-8", "yes"),
           new XElement("Report",
               new XAttribute(XNamespace.Xmlns + "rd", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"),
               new XAttribute(XNamespace.Xmlns + "cl", "http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition"),
               new XAttribute("xmlns", "http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition"),
                   new XElement("DataSources", ""),
                   new XElement("DataSets", ""),
                   new XElement("ReportSections",

这是我的代码的一部分,展示了如何生成 xml:

第二:

XNamespace reportDef = "http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition";
        XDocument d = new XDocument(
           new XDeclaration("1.0", "utf-8", "yes"),
           new XElement(reportDef + "Report",
               new XAttribute(XNamespace.Xmlns + "rd", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"),
               new XAttribute(XNamespace.Xmlns + "cl", "http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition"),
                   new XElement("DataSources", ""),
                   new XElement("DataSets", ""),
                   new XElement("ReportSections",...

第一种方法返回一个错误,第二种方法将属性xmlns添加到所有子节点。

我想要这种格式:

<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition">
4

2 回答 2

4

尝试XNamespace按照如何:使用命名空间创建文档 (C#) (LINQ to XML)中的说明添加子节点

XNamespace reportDef = "http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition";
XElement root = new XElement(reportDef + "Report",
    new XElement(reportDef + "Child", "child content"));

这应该会给你想要的结果。

您还可以通过添加xmlns属性来添加默认命名空间

XElement xe = new XElement(reportDef + "Report",
    new XAttribute("xmlns", "http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition"),
    new XElement(reportDef + "Child", "child content"));
于 2012-05-12T08:09:49.057 回答
1

您可以从@Filburt 的回答和这篇文章中看到, xmlns 属性是一个特殊属性。它只能通过 XNamespace 类访问。

下面我将举例说明如何创建命名空间。您应该查看如何:使用命名空间创建文档以获取更多信息。您的代码将xmlns标记添加到所有子节点的原因是因为您没有在同一命名空间中创建所有子节点。

  1. 要将元素放在默认命名空间中,请创建一个XNamespace(参见下面的 ns1)并将值添加到元素名称之前。例如:new XElement(ns1 + "Report");这会在 ns1 命名空间中创建一个元素<Report>,并且没有前缀。
  2. 要添加其他命名空间,请添加带有命名空间和前缀的属性。例如,new XAttribute(XNamespace.Xmlns + "ns2", ns2)将命名空间添加到带有前缀的<Report>元素。ns2此后,每次new XElement(ns2+"DataSources")使用 ns2 命名空间创建元素 ( ) 时,都会使用前缀。前缀可以用在具有前缀声明的元素下面的所有后代中。这是你犯错的地方。

        StringBuilder sb = new StringBuilder();
        XmlWriterSettings xws = new XmlWriterSettings();
        xws.OmitXmlDeclaration = true;
        xws.Indent = true;
    
        using (XmlWriter xw = XmlWriter.Create(sb, xws))
        {   
            XNamespace ns1 = "http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition";
            XNamespace ns2 = "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner";
            XNamespace ns3 = "http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition";
            XDocument doc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
            XElement reportElement = new XElement(ns1 + "Report",
                new XAttribute(XNamespace.Xmlns + "ns2", ns2),
                new XAttribute(XNamespace.Xmlns + "ns3", ns3));
            doc.Add(reportElement);
    
            reportElement.Add(new XElement(ns2+"DataSources"));
            reportElement.Add(new XElement(ns3+"DataSets"));
            reportElement.Add(new XElement(ns1+"ReportSections"));
    
            doc.WriteTo(xw);
        }
    
        System.Diagnostics.Debug.Write(sb.ToString());
    
于 2012-05-12T09:32:15.040 回答