2009-02-20 4 views
4

Je suis en train de traverser par un simple plan du site (ajout et la suppression des éléments à la volée). Ceci est la disposition de l'échantillonLinq2XML, Pourquoi Element(), Elements() ne fonctionne-t-il pas?

<?xml version="1.0" encoding="UTF-8"?> 
<urlset 
     xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 
      http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> 
    <url> 
    <loc>http://mysite.com/</loc> 
    <priority>1.00</priority> 
    <changefreq>daily</changefreq> 
    </url> 
    <url> 
    <loc>http://mysite.com/Default.aspx</loc> 
    <priority>0.80</priority> 
    <changefreq>daily</changefreq> 
    </url> 
</urlset> 

Weirdly lorsque je tente d'accéder à un élément enfant en utilisant la méthode Element() après le chargement le document, il est nul, tout comme Elements(), donc je ne peux pas les traverser. La méthode Nodes() a cependant les éléments.

Voici le code que j'ai écrit

XElement siteMap = XElement.Load(Server.MapPath("~/sitemap.xml")); 

//First remove all article nodes 
foreach (XElement elem in siteMap.Elements()) 
{ 
    XElement loc = elem.Element("loc"); 
    if (loc.Value.Contains("http://mysite.com/articles/")) 
     elem.Remove(); 
} 

Peu importe ce que je fais pour essayer de récupérer les éléments de élém (élément, éléments), je reçois un nul.

Qu'est-ce qui pourrait ne pas fonctionner? Ce code est supposé fonctionner. N'est-ce pas?

Répondre

3
var doc = XDocument.Load(Server.MapPath("~/sitemap.xml")); 
foreach (XElement elem in doc.Root.Elements()) { 
    var loc = elem.Element(XName.Get("loc","http://www.sitemaps.org/schemas/sitemap/0.9")); 
    if (loc.Value.Contains("http://astrobix.com/articles/")) 
     elem.Remove(); 
} 

Vous pouvez effectuer les opérations suivantes à la place:

doc.Root.Elements() 
    .Where(x => x.Element(XName.Get("loc", "http://www.sitemaps.org/schemas/sitemap/0.9")) 
       .Value.Contains("http://astrobix.com/articles/")) 
    .Remove(); 
+0

Je suis désolé Mehrdad, qui ne fonctionne pas. Je reçois une exception NullReferenceException dans la ligne foreach (siteMap.Element ("urlset"). Element ("url")) Quel est exactement le problème auquel je suis confronté ... Est-ce que cela a fonctionné avec les données XML? ? –

+1

Ce nouveau fonctionne. Le problème est dû au fait que le nom de l'élément est défini dans un espace de noms. Si vous spécifiez explicitement l'espace de noms, cela fonctionnera. –

Questions connexes