2016-08-09 12 views
3

XMLファイルを平坦化するために使用できるライブラリまたはメカニズムはありますか?PythonでXMLファイルを平坦化する方法

既存:

<A> 
    <B> 
     <ConnectionType>a</ConnectionType> 
     <StartTime>00:00:00</StartTime> 
     <EndTime>00:00:00</EndTime> 
     <UseDataDictionary>N</UseDataDictionary> 

が希望:

A.B.ConnectionType = a 
A.B.StartTime = 00:00:00 
A.B.EndTime = 00:00:00 
A.B.UseDataDictionary = N 
+1

私は[[xmltodict'](https://github.com/martinblech/xmltodict)ライブラリを[this](http://codereview.stackexchange.com/a/21035)と組み合わせて見ています)答えは「dict」を平らにする。 –

答えて

1

dictを平らにするthis answerとの組み合わせで、辞書にあなたのXMLファイルを変換するためにxmltodictを使用することにより、これが可能でなければなりません。

例:

# Original code: https://codereview.stackexchange.com/a/21035 
from collections import OrderedDict 

def flatten_dict(d): 
    def items(): 
     for key, value in d.items(): 
      if isinstance(value, dict): 
       for subkey, subvalue in flatten_dict(value).items(): 
        yield key + "." + subkey, subvalue 
      else: 
       yield key, value 

    return OrderedDict(items()) 

import xmltodict 

# Convert to dict 
with open('test.xml', 'rb') as f: 
    xml_content = xmltodict.parse(f) 

# Flatten dict 
flattened_xml = flatten_dict(xml_content) 

# Print in desired format 
for k,v in flattened_xml.items(): 
    print('{} = {}'.format(k,v)) 

出力:

A.B.ConnectionType = a 
A.B.StartTime = 00:00:00 
A.B.EndTime = 00:00:00 
A.B.UseDataDictionary = N 
0

これは完全な実装ではなく、あなたがlxmls's getpathを活用することができます:

xml = """<A> 
      <B> 
       <ConnectionType>a</ConnectionType> 
       <StartTime>00:00:00</StartTime> 
       <EndTime>00:00:00</EndTime> 
       <UseDataDictionary>N 
       <UseDataDictionary2>G</UseDataDictionary2> 
       </UseDataDictionary> 
      </B> 
     </A>""" 


from lxml import etree 
from StringIO import StringIO 
tree = etree.parse(StringIO(xml)) 

root = tree.getroot().tag 
for node in tree.iter(): 
    for child in node.getchildren(): 
     if child.text.strip(): 
      print("{}.{} = {}".format(root, ".".join(tree.getelementpath(child).split("/")), child.text.strip())) 

あなたを与える:

A.B.ConnectionType = a 
A.B.StartTime = 00:00:00 
A.B.EndTime = 00:00:00 
A.B.UseDataDictionary = N 
A.B.UseDataDictionary.UseDataDictionary2 = G 
関連する問題