Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python—如何通过只指定';名称';_Python_Xml - Fatal编程技术网

python—如何通过只指定';名称';

python—如何通过只指定';名称';,python,xml,Python,Xml,我正在学习xml解析和Python,并试图编写一个只允许指定“name”的函数,它可以搜索我的xml并返回文本值 目前,我的功能仅限于通过“常规设置”进行搜索: import xml.etree.ElementTree as ET tree = ET.parse('template.xml') def getValues(tree, category): for prop_node in tree.iterfind("FileTemplate/properties/o

我正在学习xml解析和Python,并试图编写一个只允许指定“name”的函数,它可以搜索我的xml并返回文本值

目前,我的功能仅限于通过“常规设置”进行搜索:

import xml.etree.ElementTree as ET

tree = ET.parse('template.xml')

    def getValues(tree, category):
        for prop_node in tree.iterfind("FileTemplate/properties/obj[@name='GeneralSettings']/properties/prop[@name='%s']" % category):
            return prop_node.text

    print getValues(tree, 'FilePattern')
有什么好的技术可以让我只需输入搜索“name”就可以编写一个函数,它可以像在unix中一样自动搜索root下的所有内容“find”-名字'?例如,如果我为“UseLapsedTime”调用get text value,我可以使用相同的函数来告诉它搜索name=UseLapsedTime吗

我的xml如下所示:

<?xml version="1.0" encoding="utf-8"?>
<autostart version="2.0">
<FileState>0</FileState>
<FileTemplate clsid="{6F6FBFC1-3F14-46CA-A269}">
<properties>
    <obj name="TypeSettings" clsid="{6F6FBFC1-3F14-46CA-A269}">
        <properties>
            <prop name="Enumerator" type="8">en0</prop>
            <prop name="Name" type="8">en0</prop>
            <prop name="Type" type="3">1</prop>
        </properties>
    </obj>
    <obj name="GeneralSettings" clsid="{6F6FBFC1-3F14-46CA-A269}">
        <properties>
            <prop name="BufferSize" type="21">524288000</prop>
            <prop name="FilePattern" type="8">auto_eth0</prop>
        </properties>
    </obj>
    <obj name="NiCSettings" clsid="{6F6FBFC1-3F14-46CA-A269}">
        <properties>
            <prop name="interface" type="21">eth0</prop>
        </properties>
    </obj>
    <obj name="Trigger" clsid="{E801FFF9-AE26-4DD7-A349">
        <trigger enabled="0" notify="1" severity="0" togglecapture="1">
            <triggerevents>
                <triggereventobj clsid="{EC5E8097-B3D5-4B8D-AA64}">
                    <triggerevent use="0" useelapsedtime="0" time="0" enabled="0" />
                </triggereventobj>
            </triggerevents>
        </trigger>
    </obj>
</properties>
   </FileTemplate>

0
en0
en0
1.
524288000
自动_eth0
eth0

是的。使用
tree.iterfind(./*[@name='%s']%name)

细分:

是起始节点。在本例中,是解析的根元素

表示XPATH描述以
树开始

/
表示递归任意数量的级别

<代码> */代码>意味着考虑任何标记

<代码> [name='fo'] < /> >仅考虑属性名为fo

的元素
%s
表示将变量的值替换为字符串

因此:

tree.iterfind(“./*[@name='%s']%name)
表示:

  • 树开始
  • 通过每一个层次
  • 查找任何元素,无论其标记名如何
  • 使用名为
    name
    的属性
  • 哪个属性的值等于变量
    name
    的内容

看看lxml包及其xpath()方法。这真的是您的XML吗?它实际上不是有效的XML。注意开头的非关闭的
autostart
标记?也许这是应该关闭的,或者应该是一个属性?