2011-06-24 15 views
11

Mam ten plik xml.C# XMLreader i węzły podrzędne

  <movies> 
      <movie> 
       <score>8.582207</score> 
       <popularity>3</popularity> 
       <translated>true</translated> 
       <adult>false</adult> 
       <language>en</language> 
       <original_name>Transformers</original_name> 
       <name>Transformers</name> 
       <alternative_name>The Transformers</alternative_name> 
       <type>movie</type> 
       <id>1858</id> 
       <imdb_id>tt0418279</imdb_id> 
       <url>http://www.themoviedb.org/movie/1858<;/url> 
       <votes>28</votes> 
       <rating>7.2</rating> 
       <certification>PG-13</certification> 
       <overview>The Earth is caught in the middle of an intergalactic war /overview> 
       <released>2007-07-04</released> 
       <images> 
        <image type="poster" url="http://hwcdn.themoviedb.org/posters/304/4bc91347017a3c57fe007304/transformers-original.jpg" size="original" id="4bc91347017a3c57fe007304"/> 
        <image type="poster" url="http://hwcdn.themoviedb.org/posters/304/4bc91347017a3c57fe007304/transformers-mid.jpg" size="mid" id="4bc91347017a3c57fe007304"/> 
        <image type="poster" url="http://hwcdn.themoviedb.org/posters/304/4bc91347017a3c57fe007304/transformers-cover.jpg" size="cover" id="4bc91347017a3c57fe007304"/> 
        <image type="poster" url="http://hwcdn.themoviedb.org/posters/304/4bc91347017a3c57fe007304/transformers-thumb.jpg" size="thumb" id="4bc91347017a3c57fe007304"/> 
        <image type="backdrop" url="http://hwcdn.themoviedb.org/backdrops/2ce/4bc91339017a3c57fe0072ce/transformers-original.jpg" size="original" id="4bc9133s9017a3c57fe0072ce"/> 
        <image type="backdrop" url="http://hwcdn.themoviedb.org/backdrops/2ce/4bc91339017a3c57fe0072ce/transformers-poster.jpg" size="poster" id="4bc91339017a3c57fe0072ce"/> 
        <image type="backdrop" url="http://hwcdn.themoviedb.org/backdrops/2ce/4bc91339017a3c57fe0072ce/transformers-thumb.jpg" size="thumb" id="4bc91339017a3c57fe0072ce"/> 
       </images> 
      <last_modified_at>2010-04-26 03:26:14</last_modified_at> 
     </movie> 
    </movies> 

Czytam wszystkie atrybuty za pomocą

textReader.ReadToFollowing("original_name"); 
string title =textReader.ReadElementContentAsString("original_name",textReader.NamespaceURI); 

Jednak cokolwiek próbuję ja nie udało się odczytać węzły potomne z „obrazów”.

+0

Możesz spojrzeć na LINQ do XML. O wiele łatwiej jest go używać do czytania/tworzenia XML-a. – m4tt1mus

Odpowiedz

23

Należy czytać elementu <images>, a następnie odczytać z pierwszym <image> potomka, a następnie odczytać do następnego rodzeństwa aż nie można już. Poniższy kod pokazuje, jak można to zrobić.

public class StackOverflow_6473251 
{ 
    public static void Test() 
    { 
     string xml = @"    <movies> 
      <movie> 
       <score>8.582207</score> 
       <popularity>3</popularity> 
       <translated>true</translated> 
       <adult>false</adult> 
       <language>en</language> 
       <original_name>Transformers</original_name> 
       <name>Transformers</name> 
       <alternative_name>The Transformers</alternative_name> 
       <type>movie</type> 
       <id>1858</id> 
       <imdb_id>tt0418279</imdb_id> 
       <url>http://www.themoviedb.org/movie/1858</url> 
       <votes>28</votes> 
       <rating>7.2</rating> 
       <certification>PG-13</certification> 
       <overview>The Earth is caught in the middle of an intergalactic war /overview> 
       <released>2007-07-04</released> 
       <images> 
        <image type=""poster"" url=""http://hwcdn.themoviedb.org/posters/304/4bc91347017a3c57fe007304/transformers-original.jpg"" size=""original"" id=""4bc91347017a3c57fe007304""/> 
        <image type=""poster"" url=""http://hwcdn.themoviedb.org/posters/304/4bc91347017a3c57fe007304/transformers-mid.jpg"" size=""mid"" id=""4bc91347017a3c57fe007304""/> 
        <image type=""poster"" url=""http://hwcdn.themoviedb.org/posters/304/4bc91347017a3c57fe007304/transformers-cover.jpg"" size=""cover"" id=""4bc91347017a3c57fe007304""/> 
        <image type=""poster"" url=""http://hwcdn.themoviedb.org/posters/304/4bc91347017a3c57fe007304/transformers-thumb.jpg"" size=""thumb"" id=""4bc91347017a3c57fe007304""/> 
        <image type=""backdrop"" url=""http://hwcdn.themoviedb.org/backdrops/2ce/4bc91339017a3c57fe0072ce/transformers-original.jpg"" size=""original"" id=""4bc9133s9017a3c57fe0072ce""/> 
        <image type=""backdrop"" url=""http://hwcdn.themoviedb.org/backdrops/2ce/4bc91339017a3c57fe0072ce/transformers-poster.jpg"" size=""poster"" id=""4bc91339017a3c57fe0072ce""/> 
        <image type=""backdrop"" url=""http://hwcdn.themoviedb.org/backdrops/2ce/4bc91339017a3c57fe0072ce/transformers-thumb.jpg"" size=""thumb"" id=""4bc91339017a3c57fe0072ce""/> 
       </images> 
      <last_modified_at>2010-04-26 03:26:14</last_modified_at> 
     </movie> 
    </movies>"; 
     XmlReader r = XmlReader.Create(new StringReader(xml)); 
     r.ReadToFollowing("original_name"); 
     string title = r.ReadElementContentAsString("original_name", r.NamespaceURI); 
     r.ReadToFollowing("images"); 
     int imageCount = 0; 
     if (r.ReadToDescendant("image")) 
     { 
      do 
      { 
       Console.WriteLine("Image {0}", ++imageCount); 
       Console.WriteLine(" Type: {0}", r.GetAttribute("type")); 
       Console.WriteLine(" URL: {0}", r.GetAttribute("url")); 
       Console.WriteLine(" Size: {0}", r.GetAttribute("size")); 
       Console.WriteLine(" ID: {0}", r.GetAttribute("id")); 
      } while (r.ReadToNextSibling("image")); 
     } 
    } 
} 
+0

Wielkie dzięki. Działa perfekcyjnie – k787

+0

Jak wrócić do przodka i kontynuować element 'last_modified_at'? – Shimmy

+0

To zadziałało dla mnie. Ale przybyłem tutaj do użytku z xmlreaderem podczas implementowania niestandardowego bloku konfiguracji. Nie mogę pomóc, ale czuję, że nie powinienem już robić tego w ten sposób, nie jestem pewien, czy inni mogą sugerować alternatywy ... –

-3

Spróbuj wykorzystanie tych obiektów:

XmlDocument xml = new XmlDocument(); 
XmlNodeList nodes = xml.ChildNodes; 
XmlNode node = nodes[0]; 
XmlNode childNode = node.ChildNodes[0]; 
+4

Będzie bardzo zła wydajność, jeśli dokument jest duży. XMLReader jest zwykle prawidłowym wyborem. –

Powiązane problemy