2015-09-10 14 views
5

私はこのXML文字列の結果を持っており、タグ間に値を取得する必要があります。しかし、XMLのデータ型は文字列です。PythonでXML文字列を解析する

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> " 

これは私のコードサンプル

root = ET.fromstring(final) 
print root 

であり、これは私が受けていますエラーです:

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

アイブ氏はET.fromstringを使用してみました。しかし、運がない。

+0

コード内に「ET」とは何ですか? – har07

+0

あなたのコードサンプルを教えてください。これは他の人が何をしようとしているのかを理解するのに役立ちますか? – Nilesh

+0

@ har07 – essramos

答えて

13

あなたのXMLが不正であるを与える必要があります。厳密に1つのトップレベル要素を持たなければなりません。 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.

(例えばTables)追加のタグで囲みにしてくださいと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 

のPython 2.7 getiterator('Table')iter('Table')に置き換える必要がありますので:

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

これにより、以下が生成されます。

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

パーフェクトな答えですが、私はOPに、より具体的にOPに関連する何かにルートタグ名を変更するように提案します。 –

+0

@BhargavRao:提案したように、タグを 'Tables'に変更しました。 –

+1

その変更をありがとう。これらの小さなことは、業界で働くことの副作用です。乾杯。 –

2

はたぶん、あなたは(また、PythonのドキュメントでParsing XMLを参照)文字列値を取得する代わりにnode.textを試し、node.attribを試してみました:

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 

これはあなたに

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

これは私が最初に試みたものですが、これを動作させるためにトップレベルのタグを追加する必要がありました。ありがとうございました! @adrianus – essramos