英文:
How to get the sibling tag value in a xml ElementTree using python,
问题
要使用ElementTree获取XML中同级元素的值。示例XML如下所示,想要获取John的值23和Jin的值20。
<MainTag xmlns="http://www.example.com">
<Tag1>
<Tag11>Sam</Tag11>
<Tag12>New York</Tag12>
<Tag13>21</Tag13>
<Tag14>Dance</Tag14>
</Tag1>
<Tag1>
<Tag11>John</Tag11>
<Tag12>New York</Tag12>
<Tag13>23</Tag13>
<Tag14>Music</Tag14>
</Tag1>
<Tag1>
<Tag11>Jenny</Tag11>
<Tag12>Sydney</Tag12>
<Tag13>20</Tag13>
</Tag1>
<Tag1>
<Tag11>Jin</Tag11>
<Tag12>Jakarta</Tag12>
<Tag13>20</Tag13>
<Tag14>Music</Tag14>
</Tag1>
</MainTag>
如果要获取John和Jin的值,你可以使用Python的ElementTree库进行解析。以下是示例代码:
import xml.etree.ElementTree as ET
# 解析XML文件
tree = ET.parse('sample.xml')
root = tree.getroot()
# 遍历XML并获取John和Jin的值
for tag1 in root.findall('.//{http://www.example.com}Tag1'):
name = tag1.find('{http://www.example.com}Tag11').text
value = tag1.find('{http://www.example.com}Tag13').text
if name == 'John' or name == 'Jin':
print(f'Value against {name}: {value}')
这段代码将遍历XML文件中的Tag1元素,找到Tag11和Tag13元素,然后检查它们的值是否为'John'或'Jin',如果是,则打印出相应的值。
英文:
Want to get the value of the sibling element in xml using ElementTree.
sample.xml is as below
want to get value 23 against John & 20 against Jin.
<MainTag xmlns="http://www.exmple.com">
<Tag1>
<Tag11>Sam</Tag11>
<Tag12>New York</Tag12>
<Tag13>21</Tag13>
<Tag14>Dance</Tag14>
</Tag1>
<Tag1>
<Tag11>John</Tag11>
<Tag12>New York</Tag12>
<Tag13>23</Tag13>
<Tag14>Music</Tag14>
</Tag1>
<Tag1>
<Tag11>Jenny</Tag11>
<Tag12>Sydney</Tag12>
<Tag13>20</Tag13>
</Tag1>
<Tag1>
<Tag11>Jin</Tag11>
<Tag12>Jakarta</Tag12>
<Tag13>20</Tag13>
<Tag14>Music</Tag14>
</Tag1>
</MainTag>
答案1
得分: 0
以下是翻译好的部分:
有趣的情况!由于您的XML文件具有默认命名空间,您需要考虑它。这可以通过两种方式之一来完成:要么声明一个命名空间,要么使用通配符。
在这种情况下,您有一个包含两个目标名称(John
和Jin
)的列表,您可能希望迭代并插入到XPath表达式中,使用f-strings。
问题在于通配符命名空间和f-strings都使用{}
,因此如果要使用通配符,您必须转义{}
,或者放弃它并声明命名空间。
所以:
import xml.etree.ElementTree as ET
tags = """[您的XML内容]"""
doc = ET.fromstring(tags)
targets = ["John","Jin"]
# 不声明命名空间,使用通配符:
for target in targets:
print(doc.find(f'.//{{*}}Tag1[{{*}}Tag11="{target}"]/{{*}}Tag13').text)
# 或者不使用通配符
ns = {'': 'http://www.exmple.com'}
for target in targets:
print(doc.find(f'.//Tag1[Tag11="{target}"]/Tag13', namespaces=ns).text)
无论哪种情况,输出都是:
23
20
英文:
Interesting situation! Since your xml has a default namespace, you have to account for it. That can be done in one of two ways: either declare a namespace or use a wildcard.
In this case, you have a list of two target names (John
and Jin
) which presumably you want to iterate over and interpolate into the xpath expression using f-strings.
The problem is that both the wildcard namespace and f-strings use {}
, so you either have to escape the {}
if you want to use wildcards, or give that up and declare the namespaces.
So:
import xml.etree.ElementTree as ET
tags = """[your xml above]"""
doc = ET.fromstring(tags)
targets = ["John","Jin"]
#using wildcards without a namespace declaration:
for target in targets:
print(doc.find(f'.//{{*}}Tag1[{{*}}Tag11="{target}"]/{{*}}Tag13').text)
#or without wildcards
ns = {'': 'http://www.exmple.com'}
for target in targets:
print(doc.find(f'.//Tag1[Tag11="{target}"]/Tag13',namespaces=ns).text)
Output in either case is
23
20
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论