2008-09-14 6 views
32

J'essaie de créer un sitemap en utilisant Linq to Xml, mais j'obtiens un attribut d'espace de noms vide dont je voudrais me débarrasser. par exemple.Espace de noms vide utilisant 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")))); 

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 les xmlns = "" sur l'élément url. Je peux le retirer en utilisant Replace sur le dernier xdoc.ToString(), mais y a-t-il un moyen plus correct?

Répondre

43

La « façon 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")))); 

même que votre code, mais avec les « ns + » avant chaque nom de l'élément qui doit être dans l'espace de noms sitemap. Il est assez intelligent pour ne pas mettre des déclarations d'espace de noms inutiles dans le fichier 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> 

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

+0

Très agréable. Merci. – peterorum

2

Si un élément utilise un espace de noms, ils doivent tous en utiliser un. Dans le cas où vous n'en définissez pas un seul, 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é". Donc, il semble qu'il n'y ait pas de meilleure méthode pour le retirer. L'utilisation de Replace ("xmlns = \" \ "", "") peut être un peu plus rapide que l'exécution d'un RegEx.

4

J'ai trébuché sur ce post tout en traitant un problème similaire dans VB.NET. J'utilisais des littéraux XML et il m'a fallu quelques recherches pour comprendre comment faire fonctionner cette solution avec la construction littérale XML et pas seulement la construction fonctionnelle.

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

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

Puis préfixez tous mes littéraux XML dans l'expression de requête avec l'espace de noms importé. Cela supprime l'espace de noms vides qui apparaissaient sur les éléments lorsque j'ai enregistré ma sortie.

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 aide quelqu'un. Malgré les bosses sur la route, l'API XLinq est vraiment cool.