在XML元素中打印文本节点值的Python代码

0 投票
2 回答
6731 浏览
提问于 2025-04-17 16:02

编辑:

谢谢大家,我完全忘了在for语句的末尾加上冒号。还有,我之前用空格的标签只是占位符!实际上,标签的名字是aword_anotherword。

现在如果我有这样的内容,

<TIER name="a">
<tier_1> 
 <tier_2>
   <tier_3> a1</tier_3> 
 </tier_2>
</tier_1>

<tier_1> 
 <tier_2>
   <tier_3> a2</tier_3> 
 </tier_2>
</tier_1>

<tier_1> 
 <tier_2>
   <tier_3> a3</tier_3> 
 </tier_2>
</tier_1>
</TIER>

<TIER name="b">
<tier_1> 
 <tier_2>
   <tier_3> b1</tier_3> 
 </tier_2>
</tier_1>

<tier_1> 
 <tier_2>
   <tier_3> b2</tier_3> 
 </tier_2>
</tier_1>

<tier_1> 
 <tier_2>
   <tier_3> b3</tier_3> 
 </tier_2>
</tier_1>
</TIER>

我该怎么做才能只打印出第一个层级中name="a"的tier_3?




我有一个像这样的xml文件

<ALL TIERS>
<tier 1> 
 <tier 2>
   <tier 3> Hello one!</tier3> 
 </tier 2>
</tier 1>

<tier 1> 
 <tier 2>
   <tier 3> Hello two!</tier3> 
 </tier 2>
</tier 1>

<tier 1> 
 <tier 2>
   <tier 3> Hello three!</tier3> 
 </tier 2>
</tier 1>

</ALL TIERS>

我想用python打印出所有tier 3的文本节点值,结果应该是这样的:

你好,第一! 你好,第二! 你好,第三!

我写了这个:

from xml.dom import minidom 
xmldoc = minidom.parse(sys.argv[1])
xlist = xmldoc.getElementsByTagName('tier 3') 

for i in xlist

    print " ".join(t.nodeValue for t in i.childNodes if t.nodeType==t.TEXT_NODE)

但这给我报了一个无效语法的错误,指向“for i in xlist”。

有人能帮我纠正一下吗?谢谢!

2 个回答

1

这里有一个获取你Xml中text的替代方法。

另外,你的Xml格式不太正确,因为标签里面有空格

import xml.etree.ElementTree as ET
txt = """<ALL-TIERS>
<tier-1>
 <tier-2>
   <tier-3> Hello one!</tier-3>
 </tier-2>
</tier-1>
<tier-1>
 <tier-2>
   <tier-3> Hello two!</tier-3>
 </tier-2>
</tier-1>
<tier-1>
 <tier-2>
   <tier-3> Hello three!</tier-3>
 </tier-2>
</tier-1>
</ALL-TIERS>
"""

root = ET.fromstring(txt)

for e in root.iter('ALL-TIERS'):
    print ">>"
    print ET.tostring(e, method="text").strip()
    print "<<"

for e in root.iter('tier-3'):
    print ">>"
    print ET.tostring(e, method="text").strip()
    print "<<"

结果是:

>>
Hello one!




    Hello two!




    Hello three!
<<
>>
Hello one!
<<
>>
Hello two!
<<
>>
Hello three!
<<
0

你现在遇到的问题是,for语句后面缺少了一个:符号。

for i in xlist:

你还需要import sys,另外你的XML格式不太正确,可能需要把<ALL TIERS>改成<ALL_TIERS>?(你也需要把结束标签改一下。)

撰写回答