Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python连接从web提取的XML字符串_Python_Xml_Lxml_Elementtree - Fatal编程技术网

使用python连接从web提取的XML字符串

使用python连接从web提取的XML字符串,python,xml,lxml,elementtree,Python,Xml,Lxml,Elementtree,我正在尝试连接两个从web提取的xml文件。我只需要在第一个XML文件的末尾添加第二个XML文件。为此,我尝试从web中提取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

我正在尝试连接两个从web提取的xml文件。我只需要在第一个XML文件的末尾添加第二个XML文件。为此,我尝试从web中提取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.xmlsyntaxer错误:仅允许在文档开头第1行第326列声明XML

XML字符串在我看来很好,我认为错误与每个提要中有两行声明有关(例如)


有谁知道一种更好的方法来连接两个从web上提取的XML文件而不写入磁盘……?

每棵树都有一个根节点。因此,每个
XML\u str
s必须附加到某个公共根节点。以下是如何做到这一点:

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))        

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

相反,您应该使用。下面是一个示例,其中来自第二个留言簿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>