2016-10-10 19 views
0

私はこれらのようなタグを含むXMLファイルを持っています。特定のXMLタグを抽出するPythonの値

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<DataFlows> 
    <DataFlow id="ABC"> 
      <Flow name="flow4" type="Ingest"> 
       <Ingest dataSourceName="type1" tableName="table1"> 
        <DataSet> 
         <DataSetRef>value1-${d1}-${t1}</DataSetRef> 
         <DataStore>ingest</DataStore> 
        </DataSet> 
        <Mode>Overwrite</Mode> 
       </Ingest> 
      </Flow>  
     </DataFlow> 
     <DataFlow id="MHH" dependsOn="ABC"> 
      <Flow name="flow5" type="Reconcile"> 
       <Reconciliation> 
        <Source>QW</Source> 
        <Target>EF</Target> 
        <ComparisonKey> 
         <Column>dealNumber</Column> 
        </ComparisonKey> 
    <ReconcileColumns mode="required"> 
         <Column>bookId</Column> 
        </ReconcileColumns> 
       </Reconciliation> 
      </Flow> 
      <Flow name="output" type="Export" format="Native"> 
       <Table publishToSQLServer="true"> 
        <DataSet> 
         <DataSetRef>value4_${cob}_${ts}</DataSetRef> 
         <DataStore>recon</DataStore> 
         <Date>${run_date}</Date> 
        </DataSet> 
        <Mode>Overwrite</Mode> 
       </Table> 
      </Flow> 
     </DataFlow> 
</DataFlows> 

このXMLをPythonで処理するには、Pythonの最小限のDOM実装を使用してください。 。

私のフロータイプは、私は、 『出力という名前の次のフロータグに行く必要がある『和解する』されている場合:私はときにのみ、「和解する』のフロータイプのDataSetタグに情報を抽出する必要が

例えば 」とDataSetRef、データソースと日付タグの抽出値。

これまでのところ、私は以下しようとしているコードを述べたが、私はすべてのフィールドを空白の値をも取得しています。

#!/usr/bin/python 

from xml.dom.minidom import parse 

import xml.dom.minidom 

# Open XML document using minidom parser 

DOMTree = xml.dom.minidom.parse("Store.xml") 

collection = DOMTree.documentElement 

#if collection.hasAttribute("DataFlows"): 

# print "Root element : %s" % collection.getAttribute("DataFlows") 

pretty = DOMTree.toprettyxml() 

print "Collectio: %s" % collection 

dataflows = DOMTree.getElementsByTagName("DataFlow") 

# Print detail of each movie. 

for dataflow in dataflows: 

    print "*****dataflow*****" 

    if dataflow.hasAttribute("dependsOn"): 

     print "Depends On is present" 

     flows = DOMTree.getElementsByTagName("Flow") 

     print "flows" 

     for flow in flows: 

     print "******flow******" 

     if flow.hasAttribute("type") and flow.getAttribute("type") == "Reconcile": 

      flowByReconcileType = flow.getAttribute("type") 

      TagValue = flow.getElementsByTagName("DataSet") 

      print "Tag Value is %s" % TagValue 

      print "flow type is: %s" % flowByReconcileType 

そこから以降、私はこれらを渡す必要があります3つの値を抽出上記のUnixシェルスクリプトを使用していくつかのディレクトリを処理します。 ご協力いただければ幸いです。

+1

ここまでお試しください。 – Mathias

+0

こんにちはマティアス、私は問題のコードを更新しました。それを調べてくれてありがとう。 –

+0

@rahulgulatiあなたの試みたコードを含めるためにあなたの質問を編集してください – har07

答えて

0

まず、XMLのフォーマットが適切かどうかを確認します。ルートタグがありません。ここでは二重引用符が間違っています<Flow name=“flow4" type="Ingest">

あなたのコードでは、データフローを正しく把握しています。

あなたは、このように照会することによって、すべてのデータフローの流れを確認することができ、フローのために再度DOMTreeを照会する必要はありません。

flows = dataflow.getElementsByTagName("Flow") 

あなたの条件if flow.hasAttribute("type") and flow.getAttribute("type") == "Reconcile":を得るためにので、私にはOKに見えます次のフロー項目では、常にこのようなことをすることができます。インデックスのチェックは配列内にあります。

for index, flow in enumerate(flows): 
    if flow.hasAttribute("type") and flow.getAttribute("type") == "Reconcile": 
     if index + 1 < len(flows): 
      your_flow = flows[index + 1] 
+0

質問自体のXMLを更新しました。そして答えに感謝します。 –

関連する問題