2016-08-30 6 views
0

У меня есть XML, как показано ниже, и используя мини-модуль python для синтаксического анализа файла build.xml. Я пытаюсь под кодом python анализировать и получать теги «name» и «value». Я пытаюсь получить значения для «SE_CONFIG», «SE_ARCH», «PREBUILDID», которые имеют соответствующее значение install-csu, macosx, prebuild_7701.Parson XML Parsing issue

Имея следующие проблемы.

  1. Что лучше вещий способ получить соответствующее имя и пару значений
  2. Как я должен поймать исключение, если нет "значение"

    <?xml version='1.0' encoding='UTF-8'?> 
    <build> 
        <actions> 
        <hudson.model.ParametersAction> 
         <parameters> 
         <hudson.model.StringParameterValue> 
          <name>StartFrom</name> 
          <description>&lt;h3&gt;: Trigger downstreamfor this platform&lt;br&gt;</description> 
          <value>Fetch_Source</value> 
         </hudson.model.StringParameterValue> 
         <hudson.model.StringParameterValue> 
          <name>SE_CONFIG</name> 
          <description></description> 
          <value>install-csu</value> 
         </hudson.model.StringParameterValue> 
         <hudson.model.StringParameterValue> 
          <name>EMAIL_RCPT</name> 
          <description>Please enter your email address.</description> 
          <value></value> 
         </hudson.model.StringParameterValue> 
         <hudson.model.StringParameterValue> 
          <name>SE_ARCH</name> 
          <description></description> 
          <value>macosx</value> 
         </hudson.model.StringParameterValue> 
         <hudson.model.StringParameterValue> 
          <name>PREBUILDID</name> 
          <description></description> 
          <value>prebuild_7701</value> 
         </hudson.model.StringParameterValue> 
         <hudson.model.StringParameterValue> 
          <name>RE_DESCRIPTION</name> 
          <description></description> 
          <value></value> 
         </hudson.model.StringParameterValue> 
         <hudson.model.StringParameterValue> 
          <name>BUILD_PRODUCT</name> 
          <description></description> 
          <value>release</value> 
         </hudson.model.StringParameterValue> 
         </parameters> 
        </hudson.model.ParametersAction> 
        </actions> 
        <number>8065</number> 
        <result>SUCCESS</result> 
        <duration>3652965</duration> 
        <charset>US-ASCII</charset> 
        <keepLog>false</keepLog> 
        <workspace>/Users/someuser/workspace/build-mac</workspace> 
        <hudsonVersion>3.2.1</hudsonVersion> 
        <scm class="hudson.scm.NullChangeLogParser"/> 
        <culprits/> 
    </build> 
    

import xml.dom.minidom 
    DOMTree=xml.dom.minidom.parse("build.xml") 
    collection=DOMTree.documentElement 
    string_par=collection.getElementsByTagName("hudson.model.StringParameterValue") 
    for each_node in string_par: 
     print each_node.getElementsByTagName('name')[0].childNodes[0].nodeValue 
     print each_node.getElementsByTagName('value')[0].childNodes[0].nodeValue 

    StartFrom 
    Fetch_Source 
    SE_CONFIG 
    install-csu 
    EMAIL_RCPT 
    Traceback (most recent call last): 
    File "<stdin>", line 3, in <module 
    IndexError: list index out of range 
+0

Проверьте длину 'списка childNodes'. Если он равен нулю, вы знаете, что не было никакой ценности. –

+0

Спасибо @JohnGordon за предложение. Существует ли более простой способ получить имя, пару значений. Я считаю, что код, который я написал, сложный и мог быть намного проще. – techrawther

ответ

3

Поскольку вы спросили, есть ли другой способ, вы можете попробовать использовать xml. etree.ElementTree.

Существует прохладный пример в следующей ссылке, метки могут быть определены в течение цикла:

http://chimera.labs.oreilly.com/books/1230000000393/ch06.html#_solution_96

Я надеюсь, что это помогает.

+0

Спасибо @ L.Felipe Мне удалось получить его через ElementTree, как показано ниже. – techrawther

1

Получите это сделано через ElementTree

doc =xml.etree.ElementTree.parse('build.xml') 
    for node in doc.iter('hudson.model.StringParameterValue'): 
     print str(node.find('name').text) + '\t' + str(node.find('value').text)