0

Web から取得した 2 つの xml ファイルを結合しようとしています。最初の XML ファイルの最後に 2 番目の 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.XMLSyntaxError: XML 宣言は、ドキュメントの先頭、行 1、列 326 でのみ許可されています

XML 文字列は問題ないように見えますが、エラーは各フィードから 2 つの宣言行があることに関連していると思います (例: )

ディスクに書き込むことなく、Web から取得した 2 つの XML ファイルを結合するより良い方法を知っている人はいますか?

4

2 に答える 2

1

2 つの xml 宣言と 2 つのルート要素があるため、2 つの xml ファイルを連結することはできません。

代わりに、ElementTree.append()を使用する必要があります。次の例では、2 番目のゲストブック 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

すべてのツリーには 1 つのルート ノードがあります。したがって、それぞれの をXML_str共通のルート ノードに追加する必要があります。これを行う方法は次のとおりです。

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 に答える