2016-10-10 3 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 с использованием минимальной реализации DOM Python. Мне нужно извлечь информацию в DataSet Tag только тогда, когда тип потока в «сверку„

Для примера:.

Если мой тип Поток „сверку“, то мне нужно, чтобы перейти к следующему теге потока под названием“Выход "и извлекать значения DataSetRef, DataSource и Даты тегов.

до сих пор я пытался нижеуказанным код, но я получаю пустые значения во всех мАЕ полей.

#!/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 Shell для обработки некоторых каталогов. Любая помощь будет оценена по достоинству.

+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": выглядит хорошо для меня, так что для того, чтобы получить следующий элемент потока, вы можете сделать что-то вроде этого, всегда проверяя, что ваш индекс находится внутри массива.

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 в самом вопросе. И спасибо за ответ. –

Смежные вопросы