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