5

Reporting Services でレポートを表示するための RDL ファイルを生成する C# プログラムがあります。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 を生成する方法を示す私のコード魔女ショーの一部です。

2番目:

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",...

最初のメソッドはエラーを返し、2 番目のメソッドは属性xmlnsをすべての子ノードに追加します。

私はこのフォーマットが欲しい:

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

2 に答える 2

4

「方法: 名前空間を使用してドキュメントを作成する (C#) (LINQ to XML)」でXNamespace説明されているように、を使用して子ノードを追加してみてください。

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");これにより<Report>、ns1名前空間に要素が作成され、プレフィックスはありません。
  2. 名前空間を追加するには、名前空間とプレフィックスを使用して属性を追加します。たとえば、接頭辞が付いた要素にnew XAttribute(XNamespace.Xmlns + "ns2", ns2)名前空間を追加します。この後、ns2名前空間を使用して要素()を作成するたびに、プレフィックスが使用されます。プレフィックスは、プレフィックス宣言のある要素の下にあるすべての子孫で使用できます。これはあなたが間違いを犯した場所です。<Report>ns2new XElement(ns2+"DataSources")

        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 に答える