2008-09-14 12 views
32

Estoy intentando crear un mapa del sitio usando Linq a Xml, pero estoy obteniendo un atributo de espacio de nombre vacío, del cual me gustaría deshacerme. p.ej.Espacio de nombre vacío con Linq Xml

XNamespace ns = "http://www.sitemaps.org/schemas/sitemap/0.9"; 

XDocument xdoc = new XDocument(new XDeclaration("1.0", "utf-8", "true"), 
    new XElement(ns + "urlset", 

    new XElement("url", 
     new XElement("loc", "http://www.example.com/page"), 
     new XElement("lastmod", "2008-09-14")))); 

El resultado es ...

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
    <url xmlns=""> 
    <loc>http://www.example.com/page</loc> 
    <lastmod>2008-09-14</lastmod> 
    </url> 
</urlset> 

Me gustaría no tener los xmlns = "" en el elemento url. Puedo quitarlo usando Reemplazar en el xdoc.ToString final(), pero ¿hay una forma más correcta?

Respuesta

43

El "camino más correcto" sería:

XDocument xdoc = new XDocument(new XDeclaration("1.0", "utf-8", "true"), 
new XElement(ns + "urlset", 
new XElement(ns + "url", 
    new XElement(ns + "loc", "http://www.example.com/page"), 
    new XElement(ns + "lastmod", "2008-09-14")))); 

mismo que el código, pero con los "ns +" antes de cada nombre del elemento que tiene que estar en el espacio de nombres del sitio. Es suficiente como para no poner ninguna declaraciones de espacios innecesarios en el XML resultante inteligente, por lo que el resultado es:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
    <url> 
    <loc>http://www.example.com/page</loc> 
    <lastmod>2008-09-14</lastmod> 
    </url> 
</urlset> 

que es, si no me equivoco, lo que quiere.

+0

Muy bonito. Gracias. – peterorum

2

Si un elemento usa un espacio de nombre, todos deben usar uno. En caso de que no defina uno por su cuenta, el marco agregará un espacio de nombres vacío como habrá notado. Y, por desgracia, no hay ningún interruptor o algo similar para suprimir esta "característica".

Por lo tanto, parece que no hay mejor método para eliminarlo. Usar Reemplazar ("xmlns = \" \ "", "") podría ser un poco más rápido que ejecutar un RegEx.

4

Me tropecé con esta publicación al tratar con un problema similar en VB.NET. Estaba usando literales XML y me llevó un poco de búsqueda descubrir cómo hacer que esta solución funcione con la construcción literal XML y no solo la construcción funcional.

La solución es importar el espacio de nombres XML en la parte superior del archivo.

Imports <xmlns:ns="x-schema:tsSchema.xml"> 

Y a continuación, prefijo todos mis literales XML en la expresión de consulta con el espacio de nombres importado. Esto elimina el espacio de nombres vacío que aparecía en los elementos cuando guardé mi salida.

Dim output As XDocument = <?xml version="1.0" encoding="utf-8"?> 
           <XML ID="Microsoft Search Thesaurus"> 
            <thesaurus xmlns="x-schema:tsSchema.xml"> 
             <diacritics_sensitive>0</diacritics_sensitive> 
             <%= From tg In termGroups _ 
              Select <ns:expansion> 
                <%= From t In tg _ 
                 Select <ns:sub><%= t %></ns:sub> %> 
               </ns:expansion> %> 
            </thesaurus> 
           </XML> 

    output.Save("C:\thesaurus.xml") 

Espero que esto ayude a alguien. A pesar de los baches en el camino como este, la API XLinq es bastante genial.

Cuestiones relacionadas