2017-08-03 29 views
0

ここで私はxmlを解析して値を取得する必要があります。私は 'personid = 01'のような属性要素を取得する必要がありますが、私はこのコードを取得できませんでした。また、私もグランド子供のノード値をフェッチする必要があります。ここでは、 "SIBLING"とその名前タグのためです。私はハードなコードを兄弟として使用せず、値を取得します。さらに、私は、複数の属性を処理し、それらを結びつけて最終的なテーブルの列として来るユニークなキーを形成する必要があります。Pythonのxmlからcsvへの変換

import xml.dom 
import xml.dom.minidom 

doc = xml.dom.minidom.parseString(''' 
<root> 
    <person id="01"> 
     <name> abc</name> 
     <age>32</age> 
     <address>addr123</address> 
     <siblings> 
     <name></name> 
     </siblings> 
    </person> 
    <person id="02"> 
     <name> def</name> 
     <age>22</age> 
     <address>addr456</address> 
     <siblings> 
     <name></name> 
     <name></name> 
     </siblings> 
    </person> 
</root> 

''') 

innerlist=[] 
outerlist=[] 
def innerHtml(root): 
    text = '' 
    nodes = [ root ] 
    while not nodes==[]: 
     node = nodes.pop() 
     if node.nodeType==xml.dom.Node.TEXT_NODE: 
      text += node.wholeText 
     else: 
      nodes.extend(node.childNodes) 
    return text 

for statusNode in doc.getElementsByTagName('person'): 
    for childNode in statusNode.childNodes: 
     if childNode.nodeType==xml.dom.Node.ELEMENT_NODE: 
      if innerHtml(childNode).strip() != '': 
       innerlist.append(childNode.nodeName+" "+innerHtml(childNode).strip()) 
    outerlist.append(innerlist) 
    innerlist=[] 
#print(outerlist) 

attrlist = [] 
nodes = doc.getElementsByTagName('person') 
for node in nodes: 
    if 'id' in node.attributes: 
     #print(node.attributes['id'].value) 
     attrlist.append(node.attributes['id'].value) 
#print(attrlist) 

dictionary = dict(zip(attrlist, outerlist)) 
print(dictionary) 

答えて

0

コメント:私はdictnoraryでそれを保存しています。 {'01': ['name abc', 'age 32', 'address addr123'], '02': ['name def', 'age 22', 'address addr456']}

あなたはCSVにdictを書くことはできません!

ValueError: dict contains fields not in fieldnames: '01' 

あなた本当にCSVに変換したいですか?
CSV File Reading and Writing

コメントを読む:ここに私は別のinnerlistとしてもタグをと並べ取得する必要があります。

CSV innerlistサポートなどをdosn't?
質問を編集し、予想されるCSV出力を表示してください!


質問:CSVへの変換XML xml.etree.ElementTree

ソリューション。

:あなたは孫ノード値を処理する方法を理解しないでください。
dictのリストとして1列に記入してください。

import csv 
import xml.etree.ElementTree as ET 
root = ET.fromstring(doc) 

fieldnames = None 
with open('doc.csv', 'w') as fh: 
    for p in root.findall('person'): 
     person = {'_id':p.attrib['id']} 
     for element in p: 
      if len(element) >= 1: 
       person[element.tag] = [] 
       for sub_e in element: 
        person[element.tag].append({sub_e.tag:sub_e.text}) 
      else: 
       person[element.tag] = element.text 

     if not fieldnames: 
      fieldnames = sorted(person) 
      w = csv.DictWriter(fh, fieldnames=fieldnames) 
      w.writeheader() 

     w.writerow(person) 

出力:パイソンでテスト

_id,address,age,name,siblings 
01,addr123,32, abc,[{'name': 'sib1'}] 
02,addr456,, def,"[{'name': 'sib2'}, {'name': 'sib3'}]" 

:3.4.2

+0

私は以下のような出力を得ました。そして私は上記のコードにいくつか変更を加えました。 personidはその値を識別するためのユニークなキーとして使用されます。私はdictnoraryにそれを保存しました。 {'01':[名前abc '、'年齢32 '、'アドレスaddr123 ']、' 02 ':[名前def'、 '年齢22'、 '住所addr456']}ここで私は別のinnerlistとしてもsibilingタグを取得する必要があります。上記のコードで – nishanth

+0

私は "兄弟"の名前属性に値を与えるのをスキップしました。 "兄弟名"タグが空の場合、私のコードはそれを付加しません。しかし、兄弟タグに値がある場合は、内部リストとして追加する必要があります。ユニークなキー "personid"の下。私は空のスペースを避けるために.strip()を使用しました.Constrainは値がそこに表示されるべきである場合です。値が存在しない場合は表示されません。私にとっては値がないのでdisplayiongはありません。値がある場合は値が表示されます。 – nishanth

+0

Plsは完全なコードを変更せずに自分のコードitslfを修正しようとします。可能なら。ありがとう。 – nishanth