2010-02-19 21 views
8

Tengo una función que genera XML para un objeto de lista:XElement Añadir función añade xmlns = "" a la XElement

public XDocument ToXML() 
{ 
    foreach (var row in this) 
    { 
     var xml = row.ToXml(); 
     template.Root.Add(xml); 
    } 
    return template; 
} 

El template.ToString() lee: <RootElement xmlns="urn:testTools">

El xml lee: <Example><SubElement>testData</SubElement></Example>

Después de la función de complemento ha ejecutado el template.ToString () dice lo siguiente: <RootElement xmlns="urn:testTools"><Example xmlns=""><SubElement>testData</SubElement></Example>

De modo que, por algún motivo, se agregó un espacio de nombres vacío, ¿cómo puedo evitar que lo haga?

Respuesta

7

Establezca el espacio de nombres en los elementos Ejemplo y SubElemento al igual que RootElement. Está agregando xmlns = "" para borrar el espacio de nombres para estos elementos.

+0

Ok Ahora entiendo por qué hace eso, ¡gracias! Pero solo es útil si fusiona diferentes xml, con diferentes espacios de nombres, no al crear un único documento xml. Además, una etiqueta de espacio de nombres vacía no es válida xml. – JJoos

+1

@JJoos: un espacio de nombres vacío es ciertamente válido XML. ¿Qué te hace pensar que no es así? Además, tenga en cuenta que un solo documento XML puede tener elementos y atributos de muchos espacios de nombres. –

+0

@John Saunders tiene razón, pensó que era ilegal debido a: http://www.w3.org/TR/REC-xml-names/ Sección 2.2 primera línea. Tipo de confusión. Gracias. – JJoos

0

Podría ser que la raíz necesita ser cerrado correctamente:

<RootElement xmlns="urn:testTools"> to <RootElement xmlns="urn:testTools"/> 
0

Lo resuelto mediante la sustitución de los elementos con una expresión regular. La solución de Foole no funcionó, porque no siempre tenía el espacio de nombres exacto en ese punto en el código.

Así que aquí es mi truco sucio que funciona:

template = XDocument.Parse(new Regex("<ElementName.*>") 
    .Replace(template.ToString(SaveOptions.DisableFormatting), "<ElementName>")); 
+4

Tenga cuidado con sus expresiones regulares. XML no es un lenguaje regular, por lo que, en general, las expresiones regulares no deben usarse contra XML. –

9

Este es un ejemplo que da salida a espacios de nombres XML sin vacíos. Observe la extraña sintaxis centrada en Linq rootNamespace + "MyElementName", que es el secreto. Este es el mismo espacio de nombres que el documento completo, por lo que no es necesaria ninguna adición de xmlns. Esto concatena un XNamespace + una cadena, que es una sobrecarga "+" que funciona para Linq y que Linq sabe cómo manejar. (Sin Linq podría ser un error de compilación para concatenar una cadena y un tipo que no sea de cadena). Tenga en cuenta que esto se ejecutó contra un archivo de proyecto C#, que es un útil archivo Xml. Envíelo a una consola o a un control richtextbox. Luego saque el "rootNamespace +" y observe la diferencia.

 XDocument doc = null; 

     using (StreamReader streamReader = 
      new StreamReader(@"myXml.csproj")) 
     { 
      doc = XDocument.Load(streamReader, LoadOptions.None); 
     } 
     XNamespace rootNamespace = doc.Root.Name.NamespaceName; 

     // A search which finds the ItemGroup which has Reference 
     // elements and returns the ItemGroup XElement. 
     XElement element = doc.Descendants().Where(p => p.Name.LocalName == "ItemGroup" 
      && p.Descendants().First<XElement>().Name.LocalName == "Reference").First<XElement>(); 

     // Create a completly new element with sub elements. 
     XElement referenceElement = new XElement(rootNamespace + "Reference", 
      new XElement(rootNamespace + "SpecificVersion", bool.FalseString), 
      new XElement(rootNamespace + "HintPath", "THIS IS A HINT PATH")); 

     // Add the new element to the main doc, to the end of the Reference elements. 
     element.Add(referenceElement); 

     // Add an attribute after the fact for effect. 
     referenceElement.SetAttributeValue("Include", "THIS IS AN INCLUDE"); 

     rtb.Text = doc.ToString(SaveOptions.None); 
+0

¡Gracias, esto parece una muy buena solución! Lo intentaré la próxima vez que vaya a este problema. – JJoos

+1

¡Gracias! ¡Esto fue muy útil! –

+1

Gracias. ¡Esto fue genial! +1 –