2012-05-12 23 views
5

Tengo el programa C# para generar el archivo RDL para mostrar el informe en los servicios de informes. Uso Linq a Xml para generar Xml.Agregue el atributo xmlns al elemento raíz

Cuando intento agregar xmlns XAtribuir al elemento de informe, encuentro varios problemas.

I PRUEBA siguientes métodos:

primeros:

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

esta es una parte de mi código bruja muestran cómo generar xml:

segundo:

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

El primer método devuelve un error y el segundo método agrega el atributo xmlns a todos los nodos secundarios.

Quiero este formato:

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

Respuesta

4

intenta agregar nodos secundarios que utilizando el XNamespace como se describe en 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")); 

Esto debe darle el resultado deseado.

También puede agregar un espacio de nombres por defecto mediante la adición de un atributo 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

puedo utilizar esta solución, pero como antes Desafortunadamente este atributo añadir a todos los nodos secundarios. –

+0

Parece extraño ya que no puedo reproducir esto.Intente agregar el atributo de espacio de nombres predeterminado como en mi segundo ejemplo. Tal vez actualice su pregunta y muestre más de su código real. – Filburt

+0

Lamentablemente como antes –

2

Se puede ver en la respuesta de @ Filburt y this puesto, que es atributo xmlns un atributo especial. Solo se puede acceder a través de la clase XNamespace.

A continuación, le daré un ejemplo sobre cómo crear espacios de nombres. Debería mirar How to: Create a Document with Namespaces para más información. El motivo por el que su código agrega etiquetas xmlns a todos los elementos secundarios es porque no está creando todos los nodos secundarios en el mismo espacio de nombres.

  1. Para poner los elementos en el espacio de nombres predeterminado, cree un (NS1 véase más adelante) XNamespace y anteponga el valor al nombre del elemento. Ejemplo: new XElement(ns1 + "Report"); Esto crea un elemento <Report> en el espacio de nombres ns1 y no tiene un prefijo.
  2. Para agregar espacios de nombres adicionales, agregue un atributo con el espacio de nombre y el prefijo. Por ejemplo, new XAttribute(XNamespace.Xmlns + "ns2", ns2) agrega un espacio de nombre al elemento <Report> con el prefijo ns2. Después de esto, cada vez que cree un elemento (new XElement(ns2+"DataSources")) con el espacio de nombres ns2, se usará el prefijo. El prefijo se puede usar en todos los descendientes debajo del elemento con la declaración de prefijo. Aquí es donde cometiste un error.

    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í, todos los nodos secundarios crean de la misma manera. Edito el primer y segundo ejemplo de código. Compruébelo por favor. gracias –

+0

@AmirReza He agregado un ejemplo y he notado su error. Básicamente, necesitabas poner 'new XElement (reportDef +" DataSources "," ")' en lugar de 'new XElement (" DataSources "," ")'. El espacio de nombres faltaba en los niños para que terminaran en el espacio de nombres vacío. – user845279

Cuestiones relacionadas