2011-06-24 11 views
11

Tengo este archivo xml.C# XMLreader y nodos secundarios

  <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> 

estoy leyendo todos los atributos utilizando

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

Sin embargo, lo que yo intento No pude leer los nodos secundarios de las "imágenes".

+0

Puede consultar LINQ to XML. Me resulta mucho más fácil de usar para leer/hacer XML. – m4tt1mus

Respuesta

23

Debe leer al elemento <images>, a continuación, leer a la primera <image> descendiente, y luego leer la siguiente hermano hasta que no puedo más. El siguiente código muestra cómo se puede hacer esto.

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

Muchas gracias. Funcionó perfecto – k787

+0

¿Cómo se vuelve a subir al antecesor y se procede con el elemento 'last_modified_at'? – Shimmy

+0

Esto funcionó para mí. Pero llegué aquí para utilizarlo con xmlreader mientras implementaba un bloque de configuración personalizado. No puedo evitar sentir que ya no debería estar haciendo las cosas de esta manera, no estoy seguro si otros pueden sugerir alternativas sin embargo ... –

-3

intentar hacer uso de estos objetos:

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

Será un rendimiento muy malo si el documento es grande. XMLReader suele ser la elección correcta. –

Cuestiones relacionadas