2015-09-10 19 views
5

Mam wynik ciągu XML i muszę uzyskać wartości pomiędzy tagami. Ale typem danych XML jest ciąg.Parsowanie łańcucha XML w języku Python

final = " <Table><Claimable>false</Claimable><MinorRev>80601</MinorRev><Operation>530600 ION MILL</Operation><HTNum>162</HTNum><WaferEC>80318</WaferEC><HolderType>HACARR</HolderType><Job>167187008</Job></Table> 

    <Table><Claimable>false</Claimable><MinorRev>71115</MinorRev><Operation>530600 ION MILL</Operation><Experiment>6794</Experiment><HTNum>162</HTNum><WaferEC>71105</WaferEC><HolderType>HACARR</HolderType><Job>16799006</Job></Table> " 

To jest mój przykładowy kod

root = ET.fromstring(final) 
print root 

I to jest błąd otrzymuję:

xml.parsers.expat.ExpatError: The markup in the document following the root element must be well-formed. 

Ive wypróbowany przy ET.fromstring. Ale bez powodzenia.

+0

Co to jest 'ET' dokładnie w kodzie? – har07

+0

Proszę podać przykładowy kod, który pomoże innym zrozumieć, co próbujesz? – Nilesh

+0

Edytowałem pytanie @ har07 – essramos

Odpowiedz

13

Twój XML jest źle sformułowany . Musi mieć dokładnie jeden element najwyższego poziomu. From Wikipedia:

Each XML document has exactly one single root element. It encloses all the other elements and is therefore the sole parent element to all the other elements. ROOT elements are also called PARENT elements.

Spróbuj umieszczenie go wewnątrz dodatkowego znacznika (np Tables) i nie przetwarza się ET

xmlData = '''<Tables> 
<Table><Claimable>false</Claimable><MinorRev>80601</MinorRev><Operation>530600 ION MILL</Operation><HTNum>162</HTNum><WaferEC>80318</WaferEC><HolderType>HACARR</HolderType><Job>167187008</Job></Table> 
<Table><Claimable>false</Claimable><MinorRev>71115</MinorRev><Operation>530600 ION MILL</Operation><Experiment>6794</Experiment><HTNum>162</HTNum><WaferEC>71105</WaferEC><HolderType>HACARR</HolderType><Job>16799006</Job></Table> 
</Tables> 
''' 

import xml.etree.ElementTree as ET 
xml = ET.fromstring(xmlData) 

for table in xml.getiterator('Table'): 
    for child in table: 
     print child.tag, child.text 

Ponieważ Pythonie 2,7 getiterator('Table') należy wymienić iter('Table'):

for table in xml.iter('Table'): 
    for child in table: 
     print child.tag, child.text 

Powoduje to:

Claimable false 
MinorRev 80601 
Operation 530600 ION MILL 
HTNum 162 
WaferEC 80318 
HolderType HACARR 
Job 167187008 
Claimable false 
MinorRev 71115 
Operation 530600 ION MILL 
Experiment 6794 
HTNum 162 
WaferEC 71105 
HolderType HACARR 
Job 16799006 
+0

Doskonała odpowiedź, chociaż sugeruję OP, aby zmienić nazwę głównego tagu na coś bardziej istotnego dla OP niż . –

+0

@BhargavRao: zgodnie z sugestią zmieniłem tag na 'Tables'. –

+1

Dzięki za tę zmianę. Te małe rzeczy są efektami ubocznymi pracy w przemyśle. Twoje zdrowie. –

2

Może próbował node.attrib, spróbuj node.text zamiast uzyskać wartość ciągu (patrz również Parsing XML w docs Pythona):

import xml.etree.ElementTree as ET 
xml_string = "<Table><Claimable>false</Claimable><MinorRev>80601</MinorRev><Operation>530600 ION MILL</Operation><HTNum>162</HTNum><WaferEC>80318</WaferEC><HolderType>HACARR</HolderType><Job>167187008</Job></Table>" 

root = ET.fromstring(xml_string) 

for child in root: 
    print child.tag, child.text 

To powinno dać wam

Claimable false 
MinorRev 80601 
Operation 530600 ION MILL 
HTNum 162 
WaferEC 80318 
HolderType HACARR 
Job 167187008 
+0

To jest to, co próbowałem na początku, ale musiałem dodać tag najwyższego poziomu, aby to zadziałało. Dziękuję Ci! @adrianus – essramos