2012-05-12 10 views
5

Ho un programma C# per generare file RDL Per mostrare il rapporto nei servizi di segnalazione. Io uso Linq per Xml per generare Xml.Aggiungi l'attributo xmlns all'elemento radice

Quando provo ad aggiungere xmlns XAttributo a Report Element, ho riscontrato diversi problemi.

I test seguenti metodi:

primi:

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

Questa è una parte del mio codice strega mostrano come generare codice XML:

secondo:

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

Il primo metodo restituisce un errore e il secondo metodo aggiunge l'attributo xmlns a tutti i nodi figlio.

Voglio questo formato:

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

risposta

4

tenta di aggiungere voi nodi figli che utilizzano il XNamespace come descritto nella How to: Create a Document with Namespaces (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")); 

Questo dovrebbe dare il risultato desiderato.

è anche possibile aggiungere un namespace predefinito aggiungendo un attributo 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")); 
+1

Io uso questa soluzione, ma purtroppo come prima questo attributo aggiungere a tutti i figli. –

+0

Sembra strano dal momento che non riesco a riprodurre questo.Prova ad aggiungere l'attributo namespace predefinito come nel mio secondo esempio. Forse aggiorna la tua domanda e mostra altro del tuo codice attuale. – Filburt

+0

Sfortunatamente come prima –

2

Si può vedere da @ risposta di Filburt e this postale, che xmlns attributo è un attributo speciale. È possibile accedervi solo tramite la classe XNamespace.

Di seguito vi fornirò un esempio su come creare spazi dei nomi. Si dovrebbe guardare How to: Create a Document with Namespaces per ulteriori informazioni. Il motivo per cui il tuo codice aggiunge tag xmlns a a tutti i bambini è perché non stai creando tutti i nodi figli nello stesso spazio dei nomi.

  1. Per mettere gli elementi nello spazio dei nomi di default, creare un XNamespace (vedi NS1 sotto) e premettere al valore al nome dell'elemento. Es: new XElement(ns1 + "Report"); Questo crea un elemento <Report> nello spazio dei nomi ns1 e non ha un prefisso.
  2. Per aggiungere spazi dei nomi aggiuntivi, aggiungere un attributo con lo spazio dei nomi e il prefisso. Ad esempio, new XAttribute(XNamespace.Xmlns + "ns2", ns2) aggiunge uno spazio dei nomi all'elemento <Report> con il prefisso ns2. Dopo questo, ogni volta che crei un elemento (new XElement(ns2+"DataSources")) con lo spazio dei nomi ns2, verrà utilizzato il prefisso. Il prefisso può essere utilizzato in tutti i discendenti sotto l'elemento con la dichiarazione del prefisso. È qui che hai fatto un errore.

    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

Sì, tutti i nodi figlio vengono creati allo stesso modo. Modifico il primo e il secondo codice di esempio. per favore controllalo. grazie –

+0

@AmirReza Ho aggiunto un esempio e ho notato il tuo errore. Fondamentalmente, dovevi inserire 'new XElement (reportDef +" DataSources "," ")' invece di 'new XElement (" DataSources "," ")'. Lo spazio dei nomi mancava nei bambini in modo che finissero nello spazio dei nomi vuoto. – user845279