32 votes

Empty namespace using Linq Xml

J'essaie de créer un plan de site à l'aide de Linq to Xml, mais j'obtiens un attribut d'espace de nom vide, dont j'aimerais me débarrasser, par exemple.

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"))));

Le résultat est ...

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

Je préférerais ne pas avoir le xmlns="" sur l'élément url. Je peux l'enlever en utilisant Replace sur le xdoc.ToString() final, mais existe-t-il une méthode plus correcte ?

43voto

Micah Points 814

La "manière plus correcte" serait :

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"))));

Comme votre code, mais avec le "ns +" devant chaque nom d'élément qui doit être dans l'espace de nom du plan du site. Il est assez intelligent pour ne pas mettre de déclarations d'espace de noms inutiles dans le XML résultant, donc le résultat est :

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

ce qui est, si je ne me trompe pas, ce que vous voulez.

4voto

Je suis tombé sur cet article en traitant un problème similaire en VB.NET. J'utilisais des littéraux XML et il m'a fallu un peu de recherche pour trouver comment faire fonctionner cette solution avec la construction littérale XML et pas seulement la construction fonctionnelle.

La solution consiste à importer l'espace de nom XML en haut du fichier.

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

Puis je préfixe tous mes littéraux XML dans l'expression de la requête avec l'espace de nom importé. Cela supprime les espaces de noms vides qui apparaissaient sur les éléments lorsque j'ai enregistré mon résultat.

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

J'espère que cela aidera quelqu'un. En dépit d'obstacles comme celui-ci, l'API XLinq est plutôt cool.

2voto

Anheledir Points 2806

Si un élément utilise un espace de noms, tous les éléments doivent en utiliser un. Si vous n'en définissez pas un vous-même, le framework ajoutera un espace de noms vide comme vous l'avez remarqué. Et, malheureusement, il n'y a pas de commutateur ou quelque chose de similaire pour supprimer cette "fonctionnalité".

Il semble donc qu'il n'y ait pas de meilleure méthode que de l'enlever. En utilisant Replace(" xmlns=\"\"", "") pourrait être un peu plus rapide que l'exécution d'un RegEx.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X