具有多个根元素的“ XML”文档

时间:2018-07-29 16:56:24

标签: python python-3.x

我有一个我无法控制的'XML'文件,我正在尝试使用etree.ElementTree进行解析,该文件包含两个根元素:

<?xml version="1.0"?>
<meta>
    ... data I do not care about
</meta>

<database>
    ... data I wish to parse
</database>

尝试解析文件时,我收到错误消息:我了解的错误'junk after document element'与它不是有效的xml有关,因为xml只能有一个根元素。我一直在寻找解决方案,尽管我发现了一些解决该问题的文章,但它们都足够不同或足够困难,以至于作为初学者,我都无法理解。

据我了解,解决方案要么是将所有内容都封装在一个新的根元素中,然后进行解析,要么以某种方式忽略/分割<meta>元素及其子元素。任何有关如何最好地做到这一点的指导将不胜感激。

2 个答案:

答案 0 :(得分:1)

Beautiful Soup可能会缓解您的问题(尽管其中是提供此服务的lxml),但是它是长期降级的,例如,当您要使用xpath时。

坚持到ET。这是严格的,不允许您解析格式不正确的XML,该XML要求一个根元素,而外面没有其他内容。

如果您设法解析xml文件,则可以确定它的格式正确。所有选项都是合法的:

1)以字符串形式读取文件,删除声明并在其周围放置根标记。然后从字符串解析。 (然后清除字符串变量。)或者您可以先编辑文件。

2)创建一个新的根元素(new_root = ET.Element('new_root')),读取文件中的顶级元素,并在其后附加SubElement。

如果文件被更改,第二个选项需要更多的编码和维护。

答案 1 :(得分:-1)

这是使用BeautifulSoup的一种解决方案,其中data是格式错误的xml。 BeautifulSoup会将其作为任何文档进行处理,因此您可以访问这两个部分:

from bs4 import BeautifulSoup

data = """<?xml version="1.0"?>
<meta>
    <somedata>1</somedata>
</meta>

<database>
    <important>100</important>
</database>"""

soup = BeautifulSoup(data, 'lxml')
print(soup.database.important.text)

打印:

100