0

我正在尝试加入我从网上提取的两个 xml 文件。我只需要在第一个 XML 文件的末尾添加第二个 XML 文件。为此,我尝试从网络中提取 XML,将它们转换为字符串,加入它们,然后从联合字符串创建一个新树。

urls = 'http://www.w3schools.com/xml/guestbook.asp', 'http://www.w3schools.com/xml/guestbook.asp'


for url in urls:
    url = url[0]
    XML = requests.get(url)

    XML_str = XML.content + XML_str


XML_data =  ET.fromstring(XML_str)
tree = ET.ElementTree(XML_data)

但是,当我这样做时,会出现以下错误。

错误:lxml.etree.XMLSyntaxError:XML 声明只允许在文档开头,第 1 行,第 326 列

XML 字符串对我来说看起来不错,我认为错误是因为每个提要有两个声明行(例如)

有谁知道一个更好的方法来加入两个从网络上提取的 XML 文件而不写入磁盘......?

4

2 回答 2

1

您不能只连接两个 xml 文件,因为会有两个 xml 声明和两个根元素。

相反,您应该使用ElementTree.append()。这是一个示例,其中来自第二个留言簿 xml 的客人被附加到第一个 xml 的留言簿中:

import requests
from xml.etree import ElementTree as ET

urls = 'http://www.w3schools.com/xml/guestbook.asp', 'http://www.w3schools.com/xml/guestbook.asp'
xml_list = [requests.get(url).content for url in urls]

root1 = ET.fromstring(xml_list[0])
root2 = ET.fromstring(xml_list[1])

for element in root2.findall('guest'):
    root1.append(element)

print ET.tostring(root1)

打印(为了便于阅读,我缩进了它):

<guestbook>
    <guest>
        <fname>Terje</fname>
        <lname>Beck</lname>
    </guest>
    <guest>
        <fname>Jan</fname>
        <lname>Refsnes</lname>
    </guest>
    <guest>
        <fname>Torleif</fname>
        <lname>Rasmussen</lname>
    </guest>
    <guest>
        <fname>anton</fname>
        <lname>chek</lname>
    </guest>
    <guest>
        <fname>stale</fname>
        <lname>refsnes</lname>
    </guest>
    <guest>
        <fname>hari</fname>
        <lname>prawin</lname>
    </guest>
    <guest>
        <fname>Hege</fname>
        <lname>Refsnes</lname>
    </guest>
    <guest>
        <fname>Terje</fname>
        <lname>Beck</lname>
    </guest>
    <guest>
        <fname>Jan</fname>
        <lname>Refsnes</lname>
    </guest>
    <guest>
        <fname>Torleif</fname>
        <lname>Rasmussen</lname>
    </guest>
    <guest>
        <fname>anton</fname>
        <lname>chek</lname>
    </guest>
    <guest>
        <fname>stale</fname>
        <lname>refsnes</lname>
    </guest>
    <guest>
        <fname>hari</fname>
        <lname>prawin</lname>
    </guest>
    <guest>
        <fname>Hege</fname>
        <lname>Refsnes</lname>
    </guest>
</guestbook>
于 2013-09-09T15:04:49.147 回答
1

每棵树都有一个根节点。因此,您的每个XML_strs 都必须附加到某个公共根节点。您可以这样做:

import lxml.etree as ET
import requests
urls = 'http://www.w3schools.com/xml/guestbook.asp', 'http://www.w3schools.com/xml/guestbook.asp'

root = ET.Element('root')
for url in urls:
    XML = requests.get(url)
    root.append(ET.fromstring(XML.content))
tree = root.getroottree()    
print(ET.tostring(tree, pretty_print=True))        
于 2013-09-09T15:03:44.107 回答