Leer Archivo XML

27/01/2009 - 04:03 por Juan Pablo Puppo | Informe spam
Hola a todos, necesito una mano con la lectura de un archivo XML, a ver si
alguien me puede dar una idea de como leerlo
tengo un archivo con una estructura asi:

<TagPrincipal>
<PrimeroNodo>
<Campo1> </Campo1>
<Campo2> </Campo2>
<SegundoNodo>
<Campo1> </Campo1>
<Campo2> </Campo2>
<TercerNodo>
<Campo1> </Campo1>
<Campo2> </Campo2>
</TercerNodo>
</SegundoNodo>
</PrimeroNodo>
</TagPrincipal>

Bueno espero que alguien me pueda ayudar, se los agradezco de antemano!!!!!

Preguntas similare

Leer las respuestas

#6 Juan Pablo Puppo
28/01/2009 - 16:00 | Informe spam
On 28 ene, 02:50, "Alberto Poblacion" <earthling-
wrote:
"Juan Pablo Puppo" wrote in messagenews:

> [...]
> Hasta ahora tengo echo este codigo pero me da problemas despues de la
> primera vuelta ya que el "Manifest" me lee todos los que hay en el xml y
> no solo los que dependen de "Mastermanifest
>  [...]
> XmlElement masterManifest = (XmlElement)node;
> [...] XmlNodeList NodeListManifest = doc.GetElementsByTagName("Manifest");

     Bien, esto tiene fácil remedio: Si en lugar de hacer
doc.GetElementsByTagName("Manifest") haces
masterManifest.GetElementsByTagName("Manifest"), te sacará todos los
Manifest del masterManifest, en lugar de sacártelos del documento, y la
misma técnica te vale para el resto de los nodos a nivel más bajo.

    De todas formas, si yo hubiera tenido que resolver este mismo problema,
lo habría hecho de otra manera que requiere mucho menos código: habría
creado las clases Mastermanifest, Manifest, Skybill y SkybillItem, que ya
contendrían cada una en su interior un array o lista con los elementos de la
siguiente clase que contiene dentro; posiblemente (si fuese necesario en
algún sitio) añadiría los atributos de serialización tales como [XmlArray],
y a continuación habría usado el XmlSerializer para deserializar el archivo
XML sobre la primera de las clases. Esto resuelve la totalidad de la lectura
de datos con sólo dos líneas de código. Es más, si tienes un XSD que
describa la estructura del archivo XML, hay una utilidad llamada xsd.exe que
es capaz de generarte automáticamente toda la jerarquía de clases para
deserializar el archivo, con lo que ni siquiera habrías tenido que escribir
éstas.



> Int32 j = 0;

> foreach (XmlNode nodeManifest in NodeListManifest)

> {

> XmlElement manifest = (XmlElement)nodeManifest;

> string xIdManifest = manifest.GetElementsByTagName("Id")[j].InnerText;

> //Guardo lo que traje del xml

> XmlNodeList NodeListSkybill = doc.GetElementsByTagName("Skybill");

> Int32 h = 0;

> foreach (XmlNode nodeSkybill in NodeListSkybill)

> {

> XmlElement skybill = (XmlElement)nodeSkybill;

> string xSkybillId = skybill.GetElementsByTagName("Id")[h].InnerText;

> XmlNodeList NodeListSkybillItem = doc.GetElementsByTagName("SkybillItem");

> Int32 p = 0;

> foreach (XmlNode nodeSkybillItem in NodeListSkybillItem)

> {

> XmlElement skybillItem = (XmlElement)nodeSkybillItem;

> }

> }

> }

> Espero que ahora se me entienda mejor, si no es asi disculpenme.

> Saludos!

> "Alberto Poblacion"
> escribió en el mensajenews:%
>> "Juan Pablo Puppo" wrote in message
>>news:%
>>> Hola perdon por no haber sido mas claro, lo que necesito es recorrer
>>> todo el XML e ir guardando esos valores

>>   Sí, pero guardando ¿cómo? ¿dónde? ¿con qué estructura? ¿Hay que
>> respetar la anidación y cargarlos, por ejemplo, en un TreeView? ¿La
>> anidación es irrelevante y se trata de extraer una tabla plana con filas
>> y columnas? En ese caso, ¿qué partes del XML serían filas y cuáles irían
>> a las columnas? ¿O quieres definir una jerarquía de clases y que las
>> propiedades coincidan con los nodos del XML? En este último caso, el
>> XmlDocument ya contiene una jerarquía de esas características, así que si
>> no te vale tendrías que afinar más y decir cómo son las características
>> de los objetos que quieres cargar, y en qué difieren de los XmlNodes.

>>   Piensa que cuando lo cargas a un XmlDocument ya está "guardado": El
>> XmlDocument es un "contenedor" que alberga todos los datos y los guarda
>> en memoria. Haciendo un doc.Load(archivo) ya has hecho lo de "recorrer
>> todo el XML e ir guardando esos valores". Me imagino que quieres ir más
>> allá y hacer algo más con ellos, por eso te ponía los ejemplos del
>> "SelectNode" y "SelectNodes", para indicarte cómo puedes ir extrayendo
>> las partes que te interesen de esos datos que ya tienes guardados.

>>    Piensa también en qué se debe entender cuando dices "esos valores". En
>> el archivo que has puesto de ejemplo lo único que hay es una serie de
>> nodos anidados unos dentro de otros, sin ningún otro contenido (como por
>> ejemplo, texto dentro de los nodos). En un archivo XML, el orden y
>> anidamiento de los nodos es significativo, y por tanto esos nodos y su
>> jerarquía podrían considerarse como "los valores" que hay en el XML, pero
>> a lo mejor no es eso lo que quieres, sino que te refieres a textos
>> guardados dentro de los nodos y por simplicidad no los has puesto en el
>> ejemplo. Si fuera así, también habría que tenerlo en cuenta, porque da un
>> significado bastante distinto a la expresión "esos valores" que has
>> utilizado.

>>    Como ves, con la información que nos has dado, queda bastante poco
>> claro lo que quieres hacer :-)



Ante todo gracias por la ayuda que me estas dando, andubo perfecto lo
de llamar a un nodo desde el nodo padre, voy a probar la otra manera
de hacerlo creando las clases.
Pero una ultima cosa, como puedo validar que exista un nodo antes de
hacer esta llamada :

string xSkybillId = skybill.GetElementsByTagName("Id")[h].InnerText;

porque resulta que a veces biene y a veces no por eso ahora me esta
generando errores. Gracias!
Respuesta Responder a este mensaje
#7 Alberto Poblacion
28/01/2009 - 18:50 | Informe spam
"Juan Pablo Puppo" wrote in message
news:
[...]
Pero una ultima cosa, como puedo validar que exista un nodo antes de
hacer esta llamada :

string xSkybillId = skybill.GetElementsByTagName("Id")[h].InnerText;

porque resulta que a veces biene y a veces no por eso ahora me esta
generando errores. Gracias!



Haz la llamada en dos fases: Primero obtén el nodo con
GetElementsByTagName, y si te devuelve null quiere decir que el nodo no
existe. Si es distinto de null, entonces ya continúas llamando a las
propiedades del nodo.
Respuesta Responder a este mensaje
#8 Juan Pablo Puppo
29/01/2009 - 04:49 | Informe spam
Muchas gracias Alberto logre terminar!! y justo porque mañana arranca en
produccion!!


"Alberto Poblacion"
escribió en el mensaje news:
"Juan Pablo Puppo" wrote in message
news:
[...]
Pero una ultima cosa, como puedo validar que exista un nodo antes de
hacer esta llamada :

string xSkybillId = skybill.GetElementsByTagName("Id")[h].InnerText;

porque resulta que a veces biene y a veces no por eso ahora me esta
generando errores. Gracias!



Haz la llamada en dos fases: Primero obtén el nodo con
GetElementsByTagName, y si te devuelve null quiere decir que el nodo no
existe. Si es distinto de null, entonces ya continúas llamando a las
propiedades del nodo.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida