2016-05-07 17 views
1

私はpythonでElement Tree経由でXMLライクなファイルを解析し、そのコンテンツをpandasデータフレームに書き込んでいます。XMLで重複した子タグを確認して削除する

私は現在、以下の問題に直面しています。子タグの存在は、異なるタグのバリエーションになります。これは、hereというソリューションでは問題にはなりません。しかし、複雑な部分は、タグの中には子タグが重複しているものと、タグが重複しているものがあります。例えば、第1の製品タグは2つの(異なる)記事番号と2つの等しいproduct_types(複製)を有し、第2の製品タグは1つだけを有する。

<main> 
    <product> 
     <article_nr>B00024J7C6</article_nr> 
     <article_nr>44253</article_nr> 
     <product_type>x</product_type> 
     <product_type>x</product_type> 
    </product> 

    <product> 
     <article_nr>B00024J7C7</article_nr> 
     <product_type>y</product_type> 
    </product> 
</main> 

私は何をしたいのは、次のとおりです。NULL値を設定された第2 article_nrが存在しない場合 1)は、そうでない場合、値をとり、「PRODUCT_TYPE」と 2)のための重複を削除します。

これまでの私のコード:

def create_dataframe(data): 
    df = pd.DataFrame(columns=('article_nr', 'article_nr2', 'product_type', 'product_type2','product_type2')) 
    for i in range(len(data)): 
     obj = data.getchildren()[i].getchildren() 
     row = dict(itertools.izip(['article_nr', 'article_nr2', 'product_type', 'product_type2','product_type2'], 
         [obj[0].text, obj[1].text, obj[2].text, obj[3].text, obj[4].text])) 
     row_s = pd.Series(row) 
     row_s.name = i 
     df = df.append(row_s) 
    return df 

2番目の「article_nr」と「PRODUCT_TYPE」の値がないため、これは、第二と第一の例と正常に動作しますが、明らかではありません。

出力は次のようになります。

article_nr article_nr product_type 
B00024J7C6 44253   x 
B00024J7C7 NULL   y 
+0

は、あなたがこれまで持っているもののコードを追加し、所望の出力ていただけますか?ありがとう。 – alecxe

+0

なぜ解析できないのですか?なぜ前にそれをする必要がありますか? – e4c5

+0

私はあなたのヒントのためにコードと望ましい出力@alecxe – lomaga

答えて

2

Python remove duplicate elements from xml treeを見て、多分それはあなたを助けることができます。このような いくつかのこと:

import xml.etree.ElementTree as ET 
path = 'in.xml' 
tree = ET.parse(path) 
root = tree.getroot() 
prev = None 

def elements_equal(e1, e2): 
    if type(e1) != type(e2): 
     return False 
    if e1.tag != e1.tag: return False 
    if e1.text != e2.text: return False 
    if e1.tail != e2.tail: return False 
    if e1.attrib != e2.attrib: return False 
    if len(e1) != len(e2): return False 
    return all([elements_equal(c1, c2) for c1, c2 in zip(e1, e2)]) 

for page in root:      # iterate over pages 
    elems_to_remove = [] 
    for elem in page: 
     if elements_equal(elem, prev): 
      print("found duplicate: %s" % elem.text) # equal function works well 
      elems_to_remove.append(elem) 
      continue 
     prev = elem 
    for elem_to_remove in elems_to_remove: 
     page.remove(elem_to_remove) 
tree.write("out.xml") 
+1

コードはすべての重複を削除することで最初の問題を解決しました。私は、次のコードを自分で第1の解決: 'root.findall内の製品( '製品')のために: article_nr = product.findall( 'article_nr') 場合LEN(article_nr)== 1: 製品.insert(1、ET.Element( 'article_nr')) ' – lomaga

関連する問題