使用Python,当一个同级元素';s标签是我要找的字符串吗?
我希望这是一个简单的问题。我会努力弄清楚我想要完成什么。下面只是我的XML文件的一小部分。我想做的是看看元素结构是否存在。如果是这样,代码将继续。然后,我尝试查看所有元素,如果子元素(test)为False,那么我希望获得id元素的文本。如果元素在元素之前,我拥有的以下代码将起作用。我希望确保列表中的任何订单ID(在之前或之后)都能获得属于相应父级的相应子ID。目前我正在使用元素树使用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
<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
讨论
- 在
循环中,我找到了cs下的所有c节点for
- 接下来,我检查“test”节点是否存在,是否为False
- 最后,我将id附加到列表中
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