使用Python,当一个同级元素';s标签是我要找的字符串吗?

使用Python,当一个同级元素';s标签是我要找的字符串吗?,python,xml,xml-parsing,parent-child,elementtree,Python,Xml,Xml Parsing,Parent Child,Elementtree,我希望这是一个简单的问题。我会努力弄清楚我想要完成什么。下面只是我的XML文件的一小部分。我想做的是看看元素结构是否存在。如果是这样,代码将继续。然后,我尝试查看所有元素,如果子元素(test)为False,那么我希望获得id元素的文本。如果元素在元素之前,我拥有的以下代码将起作用。我希望确保列表中的任何订单ID(在之前或之后)都能获得属于相应父级的相应子ID。目前我正在使用元素树 <data> <cs> <c> <id>1

我希望这是一个简单的问题。我会努力弄清楚我想要完成什么。下面只是我的XML文件的一小部分。我想做的是看看元素结构是否存在。如果是这样,代码将继续。然后,我尝试查看所有元素,如果子元素(test)为False,那么我希望获得id元素的文本。如果元素在元素之前,我拥有的以下代码将起作用。我希望确保列表中的任何订单ID(在之前或之后)都能获得属于相应父级的相应子ID。目前我正在使用元素树

<data>
<cs>
    <c>
        <id>1</id>
        <test>True</test>
        <test2>False</test2>
        <test3>False</test3>
        <test4>True</test4>
    </c>
    <c>
        <test>False</test>
        <test2>False</test2>
        <test3>False</test3>
        <id>2</id>
        <test4>True</test4>
    </c>
</cs>

1.
真的
假的
假的
真的
假的
假的
假的
2.
真的

elementTree=self.param2
isCS=elementTree.find('./cs')
getCS=elementTree.findall('./cs')
CIDs=[]
如果isCS为无:
引发异常(“无法在下找到'cs'元素结构。无法生成CID列表”)
其他:
#建立CID的列表。
对于getCS中的cs:
对于cs中的c:
对于c.getchildren()中的子对象:
如果str(child.tag).lower()=“id”:
myid=child.text
elif str(child.tag).lower()=“test”和str(child.text).lower()=“false”:
CIDs.append(myid)
打印CIDs
我得到的(取决于元素列出的顺序)是以下输出:

一,

当我真的期待以下的时候:

二,

我只需要知道如何对的子元素运行特定测试,并根据在的文本中找到的内容获取数据。

未测试

# Build the list of CID's.
for cs in getCS:
    for c in cs:
        myid = None
        mytest = None
        for child in c.getchildren():
            if str(child.tag).lower() == 'id':
                myid = child.text
            elif str(child.tag).lower() == 'test' and str(child.text).lower() == 'false':
                mytest = True
        if myid and mytest:
            CIDs.append(myid)

print CIDs
可能可以用不同的方法来完成-使用一些特殊的函数或
c
元素上的
findall()


编辑:

带有
lxml
的示例(这是唯一的示例,因此它不是“防弹的”)

导入lxml.etree
xml=“”
1.
真的
假的
假的
真的
假的
假的
假的
2.
真的
'''
tree=lxml.etree.fromstring(xml)
all_c=tree.findall('./cs/c')
#打印所有
结果=[]
对于所有类型的c:
#打印c
myid=c.find('id').text
mytest=(c.find('test').text.lower()='false')
打印myid,mytest
如果myid和mytest:
results.append(myid)
打印“结果:”,结果

这里有一种方法:

cids = []
for c_node in tree.findall('.//cs/c'):
    test_node = c_node.find('test')
    if test_node is not None and test_node.text == 'False':
        id_node = c_node.find('id')
        cids.append(id_node.text)

print cids
讨论
  • for
    循环中,我找到了cs下的所有c节点
  • 接下来,我检查“test”节点是否存在,是否为False
  • 最后,我将id附加到列表中

感谢您的回复。我最终得到了同样的答案,所以这有点可笑。如果有人知道使用find()或findall()的方法,我会全神贯注地寻找更好的方法。它正在工作,我通知代表!我添加了使用
find()
findall()
的示例,使用
lxml
非常好!效果很好。感谢您抽出时间提供这样一个好例子。
import lxml.etree

xml = '''<data>
<cs>
    <c>
        <id>1</id>
        <test>True</test>
        <test2>False</test2>
        <test3>False</test3>
        <test4>True</test4>
    </c>
    <c>
        <test>False</test>
        <test2>False</test2>
        <test3>False</test3>
        <id>2</id>
        <test4>True</test4>
    </c>
</cs>
</data>'''

tree = lxml.etree.fromstring(xml)

all_c = tree.findall('./cs/c')

#print all_c

results = []

for c in all_c:
    #print c

    myid = c.find('id').text
    mytest = (c.find('test').text.lower() == 'false')

    print myid, mytest

    if myid and mytest: 
        results.append(myid)

print "results:", results   
cids = []
for c_node in tree.findall('.//cs/c'):
    test_node = c_node.find('test')
    if test_node is not None and test_node.text == 'False':
        id_node = c_node.find('id')
        cids.append(id_node.text)

print cids