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

#1 Alberto Poblacion
27/01/2009 - 08:08 | Informe spam
"Juan Pablo Puppo" wrote in message
news:%
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



¿Y qué es lo que quieres leer? Si se trata símplemente de que lo tienes
en disco y quieres cargarlo en memoria, lo más sencillo es usar el método
Load de un objeto XmlDocument (en System.Xml), y ya está leído:

XmlDocument doc = new XmlDocument();
doc.Load("ruta\\archivo.xml");

Sin embargo, me imagino que cuando dices "leerlo" te refieres a que
quieres buscar en su interior ciertos valores siguiendo determinado
criterio. Los diversos métodos del XmlDocument te permiten hacerlo. Por
ejemplo, para buscar el Campo1 del tercer nodo:

XmlNode nodo = doc.SelectSingleNode("//TercerNodo/Campo1");

O para buscar todos los nodos que se llamen "Campo2" a cualquier nivel
del árbol:

XmlNodeList nodos = doc.SelectNodes("//Campo2");

Como no has hecho ninguna inidicación más concreta, es difícil poner un
ejemplo más específico de cómo resolverla.
Respuesta Responder a este mensaje
#2 Juan Pablo Puppo
27/01/2009 - 13:08 | Informe spam
Hola perdon por no haber sido mas claro, lo que necesito es recorrer todo el
XML e ir guardando esos valores, cabe mencionar que estos valores se repiten
n veces:

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

No tengo experiencia en XML, por eso realmente todo me parece chino basico,
saludos y gracias Alberto!!!

"Alberto Poblacion"
escribió en el mensaje news:
"Juan Pablo Puppo" wrote in message
news:%
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



¿Y qué es lo que quieres leer? Si se trata símplemente de que lo tienes
en disco y quieres cargarlo en memoria, lo más sencillo es usar el método
Load de un objeto XmlDocument (en System.Xml), y ya está leído:

XmlDocument doc = new XmlDocument();
doc.Load("ruta\\archivo.xml");

Sin embargo, me imagino que cuando dices "leerlo" te refieres a que
quieres buscar en su interior ciertos valores siguiendo determinado
criterio. Los diversos métodos del XmlDocument te permiten hacerlo. Por
ejemplo, para buscar el Campo1 del tercer nodo:

XmlNode nodo = doc.SelectSingleNode("//TercerNodo/Campo1");

O para buscar todos los nodos que se llamen "Campo2" a cualquier nivel
del árbol:

XmlNodeList nodos = doc.SelectNodes("//Campo2");

Como no has hecho ninguna inidicación más concreta, es difícil poner un
ejemplo más específico de cómo resolverla.

Respuesta Responder a este mensaje
#3 Alberto Poblacion
27/01/2009 - 17:39 | Informe spam
"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 :-)
Respuesta Responder a este mensaje
#4 Juan Pablo Puppo
28/01/2009 - 03:30 | Informe spam
Bueno antes que nada gracias realmente por la mano que me estas dando, mira
te voy a poner un ejemplo casi real (Solo faltan campos a las tablas).

<SkynetExchange>
- <MasterManifests>
- <Mastermanifest>
<Id>{96159BD0-49EA-48BB-B74E-30164F86EDC8}</Id>
<OriginStation>MAD</OriginStation>
- <Manifests>
- <Manifest>
<Id>{776A83EC-71AC-4D71-9E5A-1265B8B25083}</Id>
<ManifestPrefix>0060</ManifestPrefix>
- <Skybill>
<Id>{75E2A7E1-2777-486A-A695-2D971FD7D51E}</Id>
<OriginStation>BCN</OriginStation>
- <SkybillItem>
<Id>{13713328-C706-4EF0-9898-2DD5E5D222F8}</Id>
<SkybillId>{75E2A7E1-2777-486A-A695-2D971FD7D51E}</SkybillId>
</SkybillItem>
</Skybill>
</Manifest>
</Manifests>
</Mastermanifest>
</MasterManifests>
</SkynetExchange>

Esta estructura en realidad son 4 tablas, estas estan anidadas, estas son,
por orden de aparicion:
1) Mastermanifest
2) Manifest
3) Skybill
4) SkybillItem

Cuando digo leer me refiero a que tengo que ir recorriendo el xml e
insertandolo en clases que tengo creada por cada tabla (Mastermanifest,
Manifest, Skybill
SkybillItem), hay que tener en cuenta que :

.Pueden haber varios Mastermanifest.
.Por cada Mastermanifest pueden haber varios Manifest.
.Por Cada Manifest pueden haber varios Skybill
.Por cada Skybill pueden haber varios SkybillItem

pero la secuencua siempre es esa
Mastermanifest / Manifest /Skybill / SkybillItem
esas tablas aparecen la principal (Mastermanifest) luego de esta Manifest,
luego Skybill y por ultimo SkybillItem.

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", y ese mismo problema me lo da en
todos los nodos principales :

XmlDocument doc = new XmlDocument();

doc.Load("C:\\XMLFile.xml");

XmlNodeList nodeListMasterManifest =
doc.GetElementsByTagName("MasterManifests");

Int32 i = 0;

foreach (XmlNode node in nodeListMasterManifest)

{

XmlElement masterManifest = (XmlElement)node;

string xId = masterManifest.GetElementsByTagName("Id")[i].InnerText;

string xMastermanifestPrefix =
masterManifest.GetElementsByTagName("MastermanifestPrefix")[i].InnerText;

//Guardo lo que traje del xml

XmlNodeList NodeListManifest = doc.GetElementsByTagName("Manifest");

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 mensaje news:%
"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 :-)


Respuesta Responder a este mensaje
#5 Alberto Poblacion
28/01/2009 - 08:50 | Informe spam
"Juan Pablo Puppo" wrote in message
news:
[...]
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 mensaje news:%
"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 :-)






Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida