PDA

Ver la Versión Completa : XML, Nodos, subnodos, y más subnodos...¿Cómo leerlos? Me sale en blanco....


M.L.Casellas
22-06-2012, 01:14:21
Hola;
Llevo un par de días aprendiendo sobre ficheros .xml (después de estudiar previamente html y xhtml) y he conseguido hacer algún ejemplo y leer fichero .xml creado por mi a mono con el notepad.
Pero……todo esto era para leer un .xml que recibo de una llamada por http. Pues el fichero que recibo como respuesta no doy con la forma de extraer los datos que me interesan.
Tengo que decir que buscando info encontré en más de un sitio la el mismo tutorial de como meter un xml en un ClientDataSet y a mi no me funciona. En los ejemplos veo que insertan un ClientDataSet, DataSource y un DBGrid y ¡a volar! Pero a mi me pide algo así como provider….en fin.
Volviendo al tema principal de mi problema: El .xml que obtengo después de la llamada por http, lo guardo con codificación UTF-8. Y se guarda correctamente, lo abro con IE, Firefox….todo bien. Pero desde Delphi, no me sale nada. No da error, pero el dato en blanco.
Pego aquí un xml de respuesta al completo. Se trata de un único registro, pues es la ficha de un ISBN (de un libro):

<?xml version="1.0" encoding="UTF-8" ?>
<getRecordsXResponse xmlns="http://www.dilve.es/dilve/api/xsd/getRecordsXResponse" version="1.2">
<ONIXMessage
xmlns="http://www.editeur.org/onix/2.1/reference"
>
<Header>
<FromCompany>DILVE</FromCompany>
<SentDate>20120621</SentDate>
</Header>
<Product>
<RecordReference>9788431539474</RecordReference>
<NotificationType>03</NotificationType>
<ProductIdentifier>
<ProductIDType>03</ProductIDType>
<IDValue>9788431539474</IDValue>
</ProductIdentifier>
<ProductForm>BC</ProductForm>
<ProductFormDescription></ProductFormDescription>
<Series>
<Title>
<TitleType>01</TitleType>
<TitleText>Desarrollo profesional</TitleText>
</Title>
<NumberWithinSeries>Profesional</NumberWithinSeries>
</Series>
<Title>
<TitleType>01</TitleType>
<TitleText>Curso rápido para desarrollar la memoria</TitleText>
</Title>
<Title>
<TitleType>10</TitleType>
<TitleText>Curso rápido para desarrollar la memoria</TitleText>
</Title>
<Contributor>
<ContributorRole>A01</ContributorRole>
<PersonNameInverted>Tresoldi, Roberto</PersonNameInverted>
</Contributor>
<Language>
<LanguageRole>01</LanguageRole>
<LanguageCode>spa</LanguageCode>
</Language>
<NumberOfPages>128</NumberOfPages>
<MainSubject>
<MainSubjectSchemeIdentifier>12</MainSubjectSchemeIdentifier>
<SubjectSchemeVersion>2.1</SubjectSchemeVersion>
<SubjectCode>VS</SubjectCode>
<SubjectHeadingText>AUTOAYUDA Y DESARROLLO PERSONAL</SubjectHeadingText>
</MainSubject>
<Subject>
<SubjectSchemeIdentifier>12</SubjectSchemeIdentifier>
<SubjectSchemeVersion>2.1</SubjectSchemeVersion>
<SubjectCode>VS</SubjectCode>
<SubjectHeadingText>AUTOAYUDA Y DESARROLLO PERSONAL</SubjectHeadingText>

</Subject>
<Subject>
<SubjectSchemeIdentifier>51</SubjectSchemeIdentifier>
<SubjectCode>159.9</SubjectCode>
<SubjectHeadingText>Psicología.</SubjectHeadingText>

</Subject>
<AudienceCode>01</AudienceCode>
<OtherText>
<TextTypeCode>01</TextTypeCode>
<TextFormat>06</TextFormat>
<Text language="spa">Vivimos en una época en la que estamos sometidos a un continuo bombardeo mediático e informático que ha revolucionado el concepto......</Text>
</OtherText>
<OtherText>
<TextTypeCode>01</TextTypeCode>
<TextFormat>06</TextFormat>
<Text language="spa">Roberto Tresoldi, licenciado en Letras por la Universidad Católica de Milán, ha trabajado en el sector de la información, las relaciones públicas, la publicidad, la organización de congresos y la formación para algunas grandes empresas internacionales. Políglota (conoce más de diez lenguas modernas y varias lenguas antiguas), es autor de obras y artículos sobre la historia de la cultura, ha estudiado el tema de la memoria experimentando diversas técnicas de memorización en empresas, cursos, brainstormings y conferencias.</Text>
</OtherText>
<MediaFile>
<MediaFileTypeCode>04</MediaFileTypeCode>
<MediaFileLinkTypeCode>01</MediaFileLinkTypeCode>
<MediaFileLink>http://www.edhasa.com.ar/temp/1000/9788431539474.jpg</MediaFileLink>
</MediaFile>
<Publisher>
<NameCodeType>02</NameCodeType>
<NameCodeTypeName>DILVE_PUBLID</NameCodeTypeName>
<NameCodeValue>DLV00011981</NameCodeValue>
<PublisherName>DE VECCHI EDICIONES, S.A.</PublisherName>
</Publisher>
<CityOfPublication>Barcelona</CityOfPublication>
<CountryOfPublication>ES</CountryOfPublication>
<PublishingStatus>04</PublishingStatus>
<PublicationDate>20080930</PublicationDate>
<Measure>
<MeasureTypeCode>01</MeasureTypeCode>
<Measurement>205</Measurement>
<MeasureUnitCode>mm</MeasureUnitCode>
</Measure>
<Measure>
<MeasureTypeCode>02</MeasureTypeCode>
<Measurement>145</Measurement>
<MeasureUnitCode>mm</MeasureUnitCode>
</Measure>
<SupplyDetail>
<SupplierName>DE VECCHI EDICIONES, S.A.</SupplierName>
<SupplierRole>01</SupplierRole>
<SupplyToCountry>ES</SupplyToCountry>
<ProductAvailability>20</ProductAvailability>
<Price>
<PriceTypeCode>04</PriceTypeCode>
<PriceAmount>15.90</PriceAmount>
<CurrencyCode>EUR</CurrencyCode>
<TaxRateCode1>R</TaxRateCode1>
<TaxRatePercent1>4.0</TaxRatePercent1>
<TaxableAmount1>15.2885</TaxableAmount1>
</Price>
</SupplyDetail>
</Product>
</ONIXMessage>
</getRecordsXResponse>


Los datos (nodos, ¿verdad?) que quiero extraer son el Título, Autor, Editorial y Pvp. Pero es que este .xml tiene más subnodos de los que he visto en toda la información que he estudiado (por ejemplo: http://delphiallimite.blogspot.com.es/2007/10/trabajando-con-documentos-xml-ii.html). Y no consigo, no se como manejar los nodos. Por ejemplo, editorial es "Publisher", pero dentro de este nodo hay dos nodos que quisiera extraer: NameCodeValue y PublisherName.
Un saludo, y gracias...
Miguel

M.L.Casellas
23-06-2012, 21:53:57
Sigo aprendiendo lo que es XML. Me he comprado el libro de Miguel Ángel Acera García. También busco info en internet para lo que es el trabajarlo en Delphi. Pero sigo sin saber como hacer algo tan sencillo como buscar un campo y su tipo.
En el archivo .xml que obtengo y copié en mi anterior mensaje, la raiz de lo que es el libro es <Product> y ya dentro están los demás datos. Pero por ejemplo, el dato Título puede repetirse, pero dentro de ese nodo Título (<Title>) existen dos o más nodos, uno es <TitleType>. En mi caso quiero extraer el del dipo 01 (Es el que me interesa, porque tengo la tabla de códigos).

-<Title>
<TitleType>01</TitleType>
<TitleText>Curso rápido para desarrollar la memoria</TitleText>
</Title>
-<Title>
<TitleType>10</TitleType>
<TitleText>Curso rápido para desarrollar la memoria</TitleText>
</Title>
¿Alguien puede decirme como acceder al elemento Title, pero el que es de tipo 01. Vamos, se trata de buscar campos y filtrar. Pero no tengo ni idea. Bueno, sigo estudiando el libro XML, aunque no trata Delphi, pero quiero profundizar en lo que es XML...

Un saludo :-)

M.L.Casellas
24-06-2012, 00:06:41
He conseguido abrir el archivo .xml en un TClientDataSet, convirtiéndolo primero con XML Mapping Tool. Pero a parte de que esto es algo que debería hacer por código, así no me vale, además es que no lo ha leído bien algunos campos, la mayoría está bien, pero Título del libro sólo me saca uno y además dentro de otro Dataset.



Al final creo que haré yo la búsqueda manual en el fichero...


Un saludo :-)

chamix
24-06-2012, 03:10:09
Hola, te iba a pasar un link, pero el foro no me deja poner enlaces...

Prueba a buscar: "delphi xml db files" en google y mira la segunda página: "Database Table to XML and Back - Using Delphi"

Espero que te sirva...

Saludos.

M.L.Casellas
27-06-2012, 23:17:14
Gracias chamix :-)


No puedo probar eso ahora, pero lo haré, me interesa mucho. El caso es que como sólo necesito extraer un registro, al final lo he solucionado de otra forma más conveniente.


Y he abierto un hilo nuevo con la solución y otro título más adecuado para quien necesite ayuda en un caso similar.


El hilo es este: http://clubdelphi.com/foros/showthread.php?p=436192#post436192
Tal vez los administradores crean adecuado borrar este hilo…


¡Un saludo!

Casimiro Notevi
27-06-2012, 23:40:57
Sigue aquí (http://www.clubdelphi.com/foros/showthread.php?p=436192#post436192).

Cierro este hilo.