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>

蟒蛇代码:

#!/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,所以这可能不适合你。(我相信如果它是真的,这将立即显而易见——路径模式编译器会引发一个异常,告诉你你正在使用它从未听说过的分隔符或运算符——而不是,例如,看起来有效但实际上不匹配任何东西。 )

显而易见的解决方案是:

  • 使用 Python 2.7(或 3.x)而不是 2.6。
  • 安装 1.3(参见此处)并使用它而不是内置实现。
  • 下载 1.3(相同链接),将其ElementTree.pyElementPath.py文件复制到您的项目中,然后导入它们。
  • 安装lxml并使用它的实现而不是参考实现。
于 2013-01-11T19:41:34.980 回答