0

実行する必要があるジョブをリストした xml ファイルがあります。Pythonで解析できるようにしたいです。ここに私のサンプルXMLファイルがあります

XML コード:

<?xml version="1.0" encoding="ISO-8859-1"?>

<Jobs>

<Job name="Leo" type="upload">
    <File name="Leo.csv" source="/leegin/leo/OU" destination="/leegin/leo/OU/scripts" archive="/leegin/leo/OU/history" date="1" del="1" stat="1"/>
    <File name="Leo2.csv" source="/leegin/leo/OU" destination="/leegin/leo/OU/scripts" archive="/leegin/leo/OU/history" date="1" del="1" stat="1"/>
    <Log name="Leo.txt" path="/leegin/leo/OU/log"/>
    <Notify name="Leo Cruz" email="lcruz@me.com"/>
    <ftp port="21" proto="0" pasvmode="0" mode="0"/>
</Job>

<Job name="Manny" type="download">
    <File name="Manny.csv" source="/leegin/leo/OU" destination="/leegin/leo/OU/scripts" archive="/leegin/leo/OU/history" date="1" del="1" stat="1"/>
    <File name="Manny2.csv" source="/leegin/leo/OU" destination="/leegin/leo/OU/scripts" archive="/leegin/leo/OU/history" date="1" del="1" stat="1"/>
    <Log name="Manny.txt" path="/leegin/leo/OU/log"/>
    <Notify name="Manny Caparas" email="mcaparas@me.com"/>
    <ftp port="21" proto="0" pasvmode="0" mode="0"/>
</Job>

<Job name="Joe" type="copy">
    <File name="Joe.csv" source="/leegin/leo/OU" destination="/leegin/leo/OU/scripts" archive="/leegin/leo/OU/history" date="1" del="1" stat="1"/>
    <File name="Joe2.csv" source="/leegin/leo/OU" destination="/leegin/leo/OU/scripts" archive="/leegin/leo/OU/history" date="1" del="1" stat="1"/>
    <Log name="Joe.txt" path="/leegin/leo/OU/log"/>
    <Notify name="Joe Gomez" email="jgomez@me.com"/>
    <ftp port="21" proto="0" pasvmode="0" mode="0"/>
</Job>

</Jobs>

Python コード:

#!/usr/bin/python2.6

import sys
import optparse

def main():
    desc="""This script is used to setup and run an Automator job."""
    parser = optparse.OptionParser()
    parser.description = desc
    parser.add_option('-j', dest='jobname', type='str', action='store', help='Name of job to execute', metavar='[JobName]')
    parser.add_option('-v', dest='verbose', action='store_true', default=False, help='Used to view scripts debug information.')
    (options, args) = parser.parse_args()

    mandatory_options = ['jobname']
    for m in mandatory_options:
        if not options.__dict__[m]:
            print 'Options -j is required.'
            parser.print_help()
            sys.exit(-1)

    getjob(options.jobname)

def getjob(task):
    from xml.etree import ElementTree
    from xml.etree.ElementTree import Element
    from xml.etree.ElementTree import SubElement

    doc = ElementTree.parse('/opt/automize/template/jobs.xml')

    Files = doc.findall("./Job/File")
    for File in Files:
        print File.attrib['name']

if __name__ == '__main__':  
    main()

私がやろうとしているのは、python スクリプトにジョブ名を付けてから、スクリプトに XML ファイル内のジョブを見つけさせ、特定のジョブに関連する部分だけを抽出させることです。

これまでのところ、すべてのジョブまたはすべてのファイルのリストを作成できました。ただし、特定の仕事のためにこれを行うことはできませんでした。この件に関するご指導をいただければ幸いです。

4

1 に答える 1

1

使用findallしているメソッドは、次のパターン引数を取ります。

は、タグ名またはパス式のいずれかです。タグ名が指定されている場合、直接のサブ要素のみがチェックされます。パス式を使用して、サブツリー全体を検索できます。

「パス式」リンクをたどると、それがXPathのサブセットであることがわかります。したがって、クエリを XPath 用語 (または、etree がサポートする XPath のサブセット) で指定する正しい方法を知っている必要があります。

クエリは、すべてのFileノードの下にあるすべてのノードを要求していますJob。属性を持つすべてのFileノードの下にあるすべてのノードを要求するには、代わりに.Jobname='Manny'Job[@name='Manny']Job

そう:

doc.findall("./Job[@name='{}']/File".format(task))

残念ながら、etree 1.2 の XPath 機能は 1.3 よりもはるかに不完全であり、Python 2.6 には 1.2 が組み込まれていると思われるため、これはうまくいかないかもしれません。(これが本当なら、すぐに明らかになると思います — パス パターン コンパイラは、たとえば、動作しているように見えても実際には何にも一致しないなどではなく、聞いたことのないセパレータまたは演算子を使用していることを示す例外を発生させます。 )

明らかな解決策は次のとおりです。

  • 2.6 の代わりに Python 2.7 (または 3.x) を使用します。
  • 1.3 をインストールし (こちらを参照)、組み込み実装の代わりにそれを使用します。
  • 1.3 (同じリンク) をダウンロードし、そのファイルElementTree.pyElementPath.pyファイルをプロジェクトにコピーして、インポートするだけです。
  • lxml参照実装の代わりにその実装をインストールして使用します。
于 2013-01-11T19:41:34.980 に答える