Avatar billede hoopmaster Nybegynder
07. september 2010 - 09:50 Der er 11 kommentarer og
1 løsning

Søge efter elementer i XDocument

Jeg arbejder med en webservice som giver mig et xml document med de oplysninger jeg skal bruge... jeg smider xml'en ind i et xdocumnet og nu vil jeg så gerne søge og gemme de elementer jeg skal bruge... jeg har søgt en del, men har ikke fundet noget som virker i mit tilfælde... her er et udsnit af xdocument:

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">
  <id>https://www.google.com/webmasters/tools/feeds/http%253a%252f%252fwww.vildmedvin.dk%252f/keywords</id>
  <updated>2010-09-07T07:06:30.392Z</updated>
  <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/webmasters/tools/2007#keyword_entry" />
  <title type="text">Keywords</title>
  <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="https://www.google.com/webmasters/tools/feeds/http%253a%252f%252fwww.vildmedvin.dk%252f/keywords" />
  <link rel="self" type="application/atom+xml" href="https://www.google.com/webmasters/tools/feeds/http%253a%252f%252fwww.vildmedvin.dk%252f/keywords" />
  <openSearch:startIndex>1</openSearch:startIndex>
  <wt:keyword xmlns:wt="http://schemas.google.com/webmasters/tools/2007" source="external">vin</wt:keyword>
  <wt:keyword xmlns:wt="http://schemas.google.com/webmasters/tools/2007" source="external">www vildmedvin dk</wt:keyword>
  <wt:keyword xmlns:wt="http://schemas.google.com/webmasters/tools/2007" source="external">vildmedvin dk</wt:keyword>
  <wt:keyword xmlns:wt="http://schemas.google.com/webmasters/tools/2007" source="external">vinhandel</wt:keyword>

jeg skal gerne have fat i feks. vinhandel - nederste linje...
Avatar billede janus_007 Nybegynder
07. september 2010 - 20:53 #1
Jeg formoder du ligesom indlæser det med XDocument.Load.

Herefter kan du gøre sådan her.           
XNamespace wt = "http://schemas.google.com/webmasters/tools/2007";
var result = xdoc.Root.Elements(wt + "keyword");
var r = result.Select(x => x.Value).Last();
Avatar billede hoopmaster Nybegynder
08. september 2010 - 10:44 #2
Virker fint med ovenstående problem... takker - hvordan er det man giver points?

Håber du gider tage et kig på denne også - her vil jeg gerne have fat i feks crawl-issue og details... synes ikke jeg kan gøre det du foreslår her... Har ikke det samme namespace at arbejde med...

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:wt="http://schemas.google.com/webmasters/tools/2007">
  <id>https://www.google.com/webmasters/tools/feeds/http%253a%252f%252fwww.vildmedvin.dk%252f/crawlissues</id>
  <updated>2010-09-07T11:38:02.622Z</updated>
  <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/webmasters/tools/2007#crawl_issue_entry" />
  <title type="text">Crawl Issues</title>
  <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="https://www.google.com/webmasters/tools/feeds/http%253a%252f%252fwww.vildmedvin.dk%252f/crawlissues" />
  <link rel="self" type="application/atom+xml" href="https://www.google.com/webmasters/tools/feeds/http%253a%252f%252fwww.vildmedvin.dk%252f/crawlissues?start-index=1&amp;max-results=2" />
  <openSearch:totalResults>2</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>2</openSearch:itemsPerPage>
  <entry>
    <id>https://www.google.com/webmasters/tools/feeds/http%253a%252f%252fwww.vildmedvin.dk%252f/crawlissues/1</id>
    <updated>2010-09-07T11:38:02.622Z</updated>
    <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/webmasters/tools/2007#crawl_issue_entry" />
    <title type="text">Crawl Issue</title>
    <link rel="self" type="application/atom+xml" href="https://www.google.com/webmasters/tools/feeds/http%253a%252f%252fwww.vildmedvin.dk%252f/crawlissues/1" />
    <wt:crawl-type>web-crawl</wt:crawl-type>
    <wt:issue-type>not-found</wt:issue-type>
    <wt:url>http://www.vildmedvin.dk/Ramos-Pinto-Porto-Vintage-1994-Q.ta-da-Ervamoira.aspx</wt:url>
    <wt:date-detected>2010-08-21T15:38:29.000</wt:date-detected>
    <wt:detail>404 (Not found)</wt:detail>
    <wt:linked-from>http://www.vildmedvin.dk/planeta-la-segreta-bianco-2007.aspx</wt:linked-from>
    <wt:linked-from>http://www.vildmedvin.dk/Portvin.aspx</wt:linked-from>
    <wt:linked-from>http://www.vildmedvin.dk/adriano-ramos-pinto.aspx</wt:linked-from>
  </entry>
Avatar billede hoopmaster Nybegynder
08. september 2010 - 11:09 #3
Har kigget lidt mere og fundet ud af mit problem i stedet er at jeg ikke kan sige feks namespace + "wt:craw-type" pga tegnet :

Nogen forslag? kan nemt få feks id ud, men så snart der er et : i navnet for jeg en xmlexception fordi der ikke må være : i navnet...
Avatar billede hoopmaster Nybegynder
08. september 2010 - 11:42 #4
Ok det sidste her var pænt dumt... så holder mig lige til mit andet spørgsmål... hvordan finder jeg et enkelt element når jeg ikke har et namespace??
Avatar billede janus_007 Nybegynder
08. september 2010 - 12:34 #5
Skal lige forstå.. Npr du ikke har et namespace? Altså kilden indeholder ikke namespace, eller du ikke kender namespacet?
Avatar billede janus_007 Nybegynder
08. september 2010 - 12:40 #6
I dit nr. 2 spørgsmål har du stadig namespacet: xmlns:wt="http://schemas.google.com/webmasters/tools/2007"

Men dem du kigger efter ligger inde i entry-elementet, dvs. du skal grave dig et niveau længere ind for at få fat i dem, altså:

Tidligere:
var result = xdoc.Root.Elements(wt + "keyword"); , her peger Root på feed-elementet, du skal videre fra feed ind i entry, dvs.

var result = xdoc.Root.Element("entry").Elements(wt + "detail");
Avatar billede hoopmaster Nybegynder
08. september 2010 - 13:08 #7
Ah okay... er første gang jeg arbejder med Xdocument, men tror jeg er ved at forstå det...

din linje smider en System.NullReferenceException: Objektreferencen er ikke indstillet til en forekomst af et objekt.
Avatar billede janus_007 Nybegynder
08. september 2010 - 15:41 #8
Nåh... underligt.

Hvad giver denne her så bare:
var result = xdoc.Root.Element("entry");

Post result her :)
Avatar billede hoopmaster Nybegynder
08. september 2010 - 15:53 #9
er tom...

ikke noget at poste
Avatar billede janus_007 Nybegynder
08. september 2010 - 20:40 #10
Ja namespaces er sku lidt for besværlige, men...

XNamespace ns = "http://www.w3.org/2005/Atom";
XNamespace wt = "http://schemas.google.com/webmasters/tools/2007";
var entry = xdoc.Root.Element(ns + "entry").Element(wt + "detail");

Du kan også gøre sådan her, hvis du vil ignorere det wt namespace:

var entry = xdoc.Root.Element(ns + "entry").Elements().Where(x => x.Name.LocalName == "detail").Select(x => x.Value);

Hvis du vil have flere ud samtidigt så laver du en contains: var entry = xdoc.Root.Element(ns + "entry").Elements().Where(x => new List<string>{"detail", "crawl-type"}.Contains(x.Name.LocalName)).Select(x => x.Value);

Ofte vil man måske bare have en anonym type og så arbejde videre herfra:

var entries = xdoc.Root.Element(ns + "entry").Elements();
            var result = new
            {
                detail = entries.Where(x => x.Name.LocalName == "detail").Select(x => x.Value).Single(),
                crawltype = entries.Where(x => x.Name.LocalName == "crawl-type").Select(x => x.Value).Single()
            };
Avatar billede hoopmaster Nybegynder
20. september 2010 - 09:20 #11
Hej igen

Har haft en del andet at se til den sidste tid, men er nu tilbage på mit projekt :-) din løsning fungerer super og giver dig gerne points for svaret.

Har dog lige en enkel ting: jeg bruger den nederste løsning du har lavet og for alle de ønskede elementer ud, undtaget wt:linked-from elementer(se 2. kommentar nederst) - har det noget at gøre med det single() man skriver efter ell.? hvordan kan jeg få alle linked-from elementerne med?
Avatar billede hoopmaster Nybegynder
05. oktober 2010 - 09:53 #12
Ser ikke ud til Janus kommer tilbage, så lukker tråden
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