如何在Python中获取XML根元素的内容?

3 投票
2 回答
6558 浏览
提问于 2025-04-16 21:22

我有一个XML文件,比如:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    First line. <br/> Second line.
</root>

我想要的输出是:'\n第一行。 <br/> 第二行。\n'。我想说明的是,如果根元素里面还有其他嵌套的元素,它们应该保持原样返回。

2 个回答

0

从文件中解析:

from xml.etree.ElementTree import parse
tree = parse('yourxmlfile.xml')
print tree.getroot().text

从字符串中解析:

from xml.etree.ElementTree import fromstring
print fromstring(yourxmlstr).text
3

我想到的第一个方法是:

from xml.etree.ElementTree import fromstring, tostring

source = '''<?xml version="1.0" encoding="UTF-8"?>
<root>
    First line.<br/>Second line.
</root>
'''

xml = fromstring(source)
result = tostring(xml).lstrip('<%s>' % xml.tag).rstrip('</%s>' % xml.tag)

print result

# output:
#
#   First line.<br/>Second line. 
#

但是这个方法并不是完全通用的,因为如果根元素(<root>)里面有任何属性,它就会失效。

更新:这个方法还有另一个问题。因为 lstriprstrip 可以匹配给定字符的任何组合,所以你可能会遇到这样的情况:

# input:
<?xml version="1.0" encoding="UTF-8"?><root><p>First line</p></root>

# result:
p>First line</p

如果你真的只需要开闭标签之间的字面字符串(就像你在评论中提到的),你可以使用这个:

from string import index, rindex
from xml.etree.ElementTree import fromstring, tostring

source = '''<?xml version="1.0" encoding="UTF-8"?>
<root attr1="val1">
    First line.<br/>Second line.
</root>
'''

# following two lines are needed just to cut
# declaration, doctypes, etc.
xml = fromstring(source)
xml_str = tostring(xml)

start = index(xml_str, '>')
end = rindex(xml_str, '<')

result = xml_str[start + 1 : -(len(xml_str) - end)]

这不是最优雅的方法,但与之前的方法不同,它可以正确处理开标签中的属性,以及任何有效的 XML 文档。

撰写回答