2010-11-09 23 views
9

Wybrałem tytuł tutaj, ponieważ mój problem polega na tym, że potrzebuję uzyskać węzły elementów wymienione w przykładzie. Mam następujące XML i mam problemy z wykorzystaniem LINQ do kwerendy, byłem w stanie parsować XML przed - jednak utknąłem na to godzinami i mam nadzieję, że ktoś może pomóc. Oto moje dane XML poniżej (przykładowe dane):Jak zdobyć elementy według nazwy w XML przy użyciu LINQ

<a:entry xmlns:a="http://www.w3.org/2005/Atom"> 
<a:id>98765</a:id> 
<info>Data Catalogue</info> 
    <data> 
    <items> 
      <item> 
       <id>123456</id> 
       <value>Item One</value> 
      </item> 
      <item> 
       <id>654321</id> 
       <value>Item Two</value> 
      </item> 
     <items> 
    </data> 
    <items> 
     <item> 
     <id>123456</id> 
     <value>Item One</value> 
     </item> 
     <item> 
     <id>654321</id> 
     <value>Item Two</value> 
     </item> 
    <items> 
    <a:author> 
    <a:name>Catalogue</a:name> 
    </a:author> 
</a:entry> 

Chcę być w stanie wyodrębnić identyfikator z elementu XML tag w punktach, jednak istnieje Tag przedmioty z wpisami pozycja w ramach danych nie mam w ogóle nie chce tych węzłów - chcę, żeby root/items/id/id były wyrażone jako ścieżka. Próbowałem wszystkiego, co wiem, z LINQ, więc jeśli ktoś mógłby pomóc, rzeczy do zapamiętania, chociaż jest to przykładowe dane oparte na systemie - format nie może być zmieniony, więc nie jest to dopuszczalne rozwiązanie.
Nie mogę określić, gdzie idę źle - każde wyrażenie LINQ, które staram się nie zwracać, wydaje mi się, że przestrzeń nazw jest problemem i próbowałem to zintegrować, ale zamierzam się kręcić.
Rozwiązanie musi pracować w Silverlight i C#

Próbowałem następujące:

IEnumerable<XElement> nodes = 
element.Elements().Where(e => e.Name.LocalName == "items") 

Jednak to robi mi wszystkie „elementy”, w tym te, które w ramach „data” nie chcę ci.


Gdybym wykonaj następujące czynności w moim XML Widzę nazwiskami Elements wyświetlany:

XElement element = XElement.Parse(data); 
foreach (XElement node in element.Elements()) 
{ 
    MessageBox.Show(node.Name.LocalName); 
} 

Jednak kiedy mogę to zrobić nie mogę zobaczyć nazwy węzłów w punktach na wszystkich - I” ve sprawdził XElement i ma węzeł, a kiedy wypisuję powyższe nazwy, pojawia się "items" wraz z info i id!

foreach (XElement node in element.Elements("items")) 
    { 
    MessageBox.Show(node.Name.LocalName); 
    } 
+1

wyobraziłem go - był dodatkowy deklaracja przestrzeni nazw, które było puste - dodawanie dorozumianą nazw do mojego XML, używając do tego XNamespace i dodanie go do nazwy elementu rozwiązuje problem! – RoguePlanetoid

Odpowiedz

18

Zakładając element to <a:entry> elementem:

var ids = element.Element("items") 
       .Elements("item") 
       .Select(item => item.Element("id").Value); 

Element i Elements metody zwróci tylko bezpośrednie dzieci, nie wszystkie elementy podrzędne, więc nie zwraca element <items> który jest pod <data>

+1

To nie działa, chociaż myślałem, że tak, ponieważ jest to rodzaj tego, z którego korzystałem wcześniej - okazuje się, że nie mogę uzyskać żadnych elementów z korzenia, w ogóle był węzeł wartości z korzenia, który mi przerwał w tym przykładzie i nie mogę go odczytać - jeśli zapytam potomków, tam są tacy - po prostu nie wiem, co się dzieje. – RoguePlanetoid

+0

To działa, gdy uwzględniam przestrzeń nazw tak jak moja własna odpowiedź! – RoguePlanetoid

+0

Nie podałeś tych informacji w swoim pytaniu ... Próbowałem go używając elementu '' jako root i działało dobrze. –

6

Miałem pustą deklarację NameSpace w moim XMLu Nie zauważyłem kiedy dodałem to do mojego kodu zadziałało - zapomniałem LINQ to bardzo NameSpace ori ented!

XNameSpace ns = "http://example.org/namespace"; 
var ids = element.Element(ns + "items") 
       .Elements("item") 
       .Select(item => item.Element("id").Value); 
+1

Miał ten sam problem, to rozwiązało go! –

Powiązane problemy