tutorial - system xml linq example c#
Espacio de nombres vacĂo utilizando Linq Xml (3)
La "forma más correcta" 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"))));
Igual que su código, pero con "ns +" antes de cada nombre de elemento que debe estar en el espacio de nombre del mapa del sitio. Es lo suficientemente inteligente como para no colocar declaraciones de espacio de nombre innecesarias en el XML resultante, 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 quieres.
Estoy tratando de crear un mapa del sitio usando Linq a Xml, pero estoy obteniendo un atributo de espacio de nombres vacío, del cual me gustaría deshacerme. p.ej
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>
Preferiría no tener xmlns = "" en el elemento url. Puedo quitarlo usando Reemplazar en el xdoc.ToString final (), pero ¿hay una forma más correcta?
Si un elemento usa un espacio de nombres, 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".
Entonces, parece que no hay un mejor método para desmantelarlo. Usar Reemplazar ("xmlns = /" / "", "") podría ser un poco más rápido que ejecutar un RegEx.
Me encontré 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 luego prefijo todos mis literales XML en la expresión de consulta con el espacio de nombres importado. Esto elimina el espacio de nombre vacío que estaba apareciendo 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.