library example etree create python xml xml-parsing elementtree

example - xml python 3



AnĂ¡lisis: Cadena a XML (1)

Se supone que mi API toma una cadena y la encasilla al formato XML.

Pero recibo constantemente este error:

ParseError: etiqueta no coincidente: línea 1, columna 764

XML

<?xml version="1.0" encoding="utf-8" ?> <MasterDetails IssuerId="5" Version="12.2"> <XMLRequest /> <BookingDetails Amount="768" Comment="Hotel Travel Purchase" CurrencyCode="INR" PurchaseType="Hotel" SupplierName="SomeHotel" CardAlias="C_ALIAS" ValidFor="-1D" CurrencyType="B" /> <CDFs> <CDF FieldName="Order Date" FieldValue="2015-01-01" /> </CDFs> <SomeTag> <Rule Action="A" Alias="MyAlias"> <Controls> <OPMCCControl Negate="False"/> <OPMIDControl /> <SomeControlsTags CumulativeLimit="768" MaxTrans="None" Period="C" /> <ValidityPeriod ValidFrom="2015-01-01 00:00:00.0 +0000" ValidTo="2015-01-11 00:00:00.0 +0000" /> </Controls> </Rule> </SomeTag> </BookingDetails> <Email EmailAddress="[email protected]"/> <MasterDetails />

Implementado a través de:

tree = ET.ElementTree(ET.fromstring(kk.strip()))

¡Estoy seguro de que mi cadena XML contiene todas las etiquetas coincidentes y está formateada, pero todavía podría faltar algo delante de mis ojos!


La etiqueta BookingDetails se cierra automáticamente en esta línea:

<BookingDetails Amount="768" Comment="Hotel Travel Purchase" CurrencyCode="INR" PurchaseType="Hotel" SupplierName="SomeHotel" CardAlias="C_ALIAS" ValidFor="-1D" CurrencyType="B" />

Pero cuando hay un elemento BookingDetails cierre por separado:

</BookingDetails>

Además, <MasterDetails /> no se cierra correctamente en la última línea. Debe ser </MasterDetails> lugar de <MasterDetails /> .

Tenga en cuenta que puede analizar este XML en el modo "recuperar" si se utiliza lxml.etree :

import lxml.etree as ET parser = ET.XMLParser(recover=True) tree = ET.ElementTree(ET.fromstring(data, parser=parser))

O bien, use BeautifulSoup con características xml :

from bs4 import BeautifulSoup soup = BeautifulSoup(data, "xml") print(soup.prettify())