2012-05-12 12 views
5

Ich habe C# Programm zum Generieren RDL-Datei Für whitch Zeige Bericht in Reporting Services. Ich benutze Linq zu Xml, um Xml zu generieren.Add Xmlns Attribut zu Root-Element

Wenn ich versuche, xmlns XAttribute zu Berichtselement hinzuzufügen, stoße ich auf mehrere Probleme.

Ich teste folgende Methoden:

zuerst:

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

das ist ein Teil meiner Code Hexe zeigen, wie xml erzeugen:

Sekunde:

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

Die erste Methode gibt einen Fehler zurück und die zweite Methode fügt das Attribut xmlns zu allen untergeordneten Knoten hinzu.

Ich möchte dieses Format:

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

Antwort

4

Versuchen Sie untergeordnete Knoten, wie How to: Create a Document with Namespaces (C#) (LINQ to XML) in

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

Dies sollte Ihnen das gewünschte Ergebnis mit der XNamespace hinzuzufügen.

Sie können auch einen Standard-Namespace durch Hinzufügen eines xmlns Attribut

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

Ich benutze diese Lösung aber leider nach wie vor dieses Attribut auf alle untergeordneten Knoten hinzuzufügen. –

+0

Scheint seltsam, da ich das nicht reproduzieren kann.Versuchen Sie, das Standard-Namespace-Attribut wie in meinem zweiten Beispiel hinzuzufügen. Vielleicht aktualisieren Sie Ihre Frage und zeigen mehr von Ihrem tatsächlichen Code. – Filburt

+0

Leider wie vorher –

2

fügen Sie von @ Filburt Antwort sehen und this Post, dass xmlns Attribut ein spezielles Attribut ist. Es kann nur über die XNamespace-Klasse zugegriffen werden.

Im Folgenden werde ich Ihnen ein Beispiel zum Erstellen von Namespaces geben. Sie sollten sich How to: Create a Document with Namespaces für weitere Informationen ansehen. Der Grund dafür, dass Ihr Code allen Kindern xmlns Tags hinzufügt, liegt daran, dass Sie nicht alle untergeordneten Knoten im selben Namespace erstellen.

  1. Um Elemente in den Standard-Namespace zu setzen, erstellen Sie ein XNamespace (siehe ns1 unten) und den Wert auf den Elementnamen voranstellen. Bsp .: new XElement(ns1 + "Report"); Dies erstellt ein Element <Report> im Ns1-Namespace und hat kein Präfix.
  2. Um weitere Namespaces hinzuzufügen, fügen Sie ein Attribut mit dem Namespace und dem Präfix hinzu. Beispiel: new XAttribute(XNamespace.Xmlns + "ns2", ns2) fügt dem Element <Report> mit dem Präfix ns2 einen Namensbereich hinzu. Danach wird jedes Mal, wenn Sie ein Element (new XElement(ns2+"DataSources")) mit dem Namensraum ns2 erstellen, das Präfix verwendet. Das Präfix kann in allen Nachkommen unterhalb des Elements mit der Präfix-Deklaration verwendet werden. Hier hast du einen Fehler gemacht.

    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()); 
    
+0

Ja, alle untergeordneten Knoten erstellen denselben Weg. Ich bearbeite ersten und zweiten Beispielcode. Überprüfen Sie bitte das. danke –

+0

@AmirReza Ich habe ein Beispiel hinzugefügt und Ihren Fehler notiert. Im Grunde mussten Sie 'neues XElement (reportDef +" DataSources "," ")' anstelle von 'neues XElement (" DataSources "," ")' einfügen. Der Namespace fehlte in den Kindern, sodass sie im leeren Namespace landen würden. – user845279