Avatar billede Ole_N Nybegynder
28. juli 2011 - 13:04 Der er 5 kommentarer og
1 løsning

læsning af sitemap.xml

Hej Eksperter,

JJeg er ved at lave en funktion der skal kunne læse en sitemap.xml fil og retuner listen af urls i den, men ken kan ikke få min funktion til at virke det den retuner er tomt hvergang? I kan se den sitemap.xml fil jeg prøver at læse, samt min C# funktion her under :

Her er den sitmap.xml fil jeg prøver at læse :

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>http://www.demo.dk/</loc>
    <changefreq>always</changefreq>
    <priority>1.00</priority>
  </url>
  <url>
    <loc>http://www.demo.dk/demo/om-demo</loc>
    <changefreq>always</changefreq>
    <priority>0.80</priority>
  </url>
</urlset>

Her er min c# funktion :

public List<string> ReadSiteMap(string Url)
  {
     

      List<string> TheReturn = new List<string>();
      XmlReader xmlReader = new XmlTextReader(string.Format("{0}sitemap.xml", Url));
      XPathDocument document = new XPathDocument(xmlReader);
      XPathNavigator navigator = document.CreateNavigator();

      XmlNamespaceManager resolver = new XmlNamespaceManager(xmlReader.NameTable);
      resolver.AddNamespace("sitemap", "http://www.google.com/schemas/sitemap/0.9");

      XPathNodeIterator iterator = navigator.Select("/sitemap:urlset/sitemap:url/sitemap:loc", resolver);

      while (iterator.MoveNext())
      {
          if (iterator.Current == null)
              continue;

          TheReturn.Add(iterator.Current.Value);
      }
         
      return TheReturn;
  }
Avatar billede jokkejensen Novice
28. juli 2011 - 16:06 #1
NAvigator.select() forventer et xpath udtryk der rent faktisk rammer en node.

ala: /urlset/url/loc

Desuden tror jeg ikke du behøver importere det namespace.
Avatar billede janus_007 Nybegynder
28. juli 2011 - 21:05 #2
Hvis du bare vil have loc i hver url kan du gøre sådan her.

var xDoc = XDocument.Load(@"sitemap.xml");
XNamespace ns = "http://www.sitemaps.org/schemas/sitemap/"; //dit namespace :)

var locs = xDoc.Element(ns + "urlset").Elements(ns + "url").Elements(ns + "loc").Select(x => new{UrlLoc = x.Value});


lidt nemmere end at sidde med iterationer og xpath :)
Avatar billede Ole_N Nybegynder
29. juli 2011 - 08:19 #3
rettelsen af xpath udtrykket til /urlset/url/loc retuner stadig et tomt resultat ??

hvad angår xDoc funktionen er der to ting :

1. Elements(ns + "url") understøtter ikke et ydeligere niavau med Elements(ns + "...")

2. Selv på andet niavau hvor den burde fange alle "url" tags fejler linjen :

var locs = xDoc.Element(ns + "urlset").Elements(ns + "url").Elements(ns + "loc").Select(x => new{UrlLoc = x.Value});

Med en null reference ?
Avatar billede janus_007 Nybegynder
29. juli 2011 - 13:13 #4
Hej Ole

Ikke udfra den lille xml-sekvens du har vedhæftet. :) Det virker hos mig :)

Hvilken version af .Net kører du?

Og du har lavet en : using System.Xml.Linq;  ?


Ellers smid den kode du bruger, så vi kan se hvor fejlen opstår.
Avatar billede Ole_N Nybegynder
29. juli 2011 - 15:00 #5
jeg køre med 4.0 og jeg har til føjet System.Xml.Linq : her er min kode :

List<string> TheReturn = new List<string>();
  var xDoc = System.Xml.Linq.XDocument.Load(@"http://www.chr-hansen.com/sitemap.xml");
      System.Xml.Linq.XNamespace ns = "http://www.sitemaps.org/schemas/sitemap/";

var locs = xDoc.Element(ns + "urlset").Elements(ns + "url").Select(x => new{UrlLoc = x.Value});

using (var Loc = locs.GetEnumerator())
{

    while (Loc.MoveNext())
    {
        TheReturn.add(Loc.Current.ToString());
       
    }
}

return TheReturn;

og det giver en nullref exception
Avatar billede janus_007 Nybegynder
30. juli 2011 - 10:12 #6
Hej..

Der er ingen grund til at iterere hen over locs med en GetEnumerator, det er allerede en IEnumerable<string>

Hvis du vil returnere som list, altså TheReturn, så:

return locs.ToList();
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester