简体   繁体   English

带有xmltodict unparse()函数的ValueError-Python 3

[英]ValueError with xmltodict unparse() function - Python 3

I'm having trouble using xmltodict to convert json to xml. 我在使用xmltodict将json转换为xml时遇到问题。 It works fine with a single root and a single object, however when I try to convert multiple objects it returns a ValueError "ValueError: document with multiple roots". 它可以与单个根和单个对象配合使用,但是当我尝试转换多个对象时,它将返回ValueError“ ValueError:具有多个根的文档”。

Here's my JSON data: 这是我的JSON数据:

Here's my script thus far: 到目前为止,这是我的脚本:

import json
import xmltodict

    y = """{{  "markers":[  {  "point":"new GLatLng(40.266044,-74.718479)","awayTeam":"LUGip","markerImage":"images/red.png","fixture":"Wednesday 7pm","information":"Linux users group meets second Wednesday of each month.","previousScore":"","capacity":"","homeTeam":"Lawrence Library"},{  "point":"new GLatLng(40.211600,-74.695702)","awayTeam":"LUGip HW SIG","tv":"","markerImage":"images/white.png","fixture":"Tuesday 7pm","information":"Linux users can meet the first Tuesday of the month to work out harward and configuration issues.","capacity":"","homeTeam":"Hamilton Library"},{  "point":"new GLatLng(40.294535,-74.682012)","awayTeam":"After LUPip Mtg Spot","tv":"","markerImage":"images/newcastle.png","fixture":"Wednesday whenever","information":"Some of us go there after the main LUGip meeting, drink brews, and talk.","capacity":"2 to 4 pints","homeTeam":"Applebees"}]}"""

y2 = json.loads(y)
print(xmltodict.unparse(y2, pretty = True))

Result: 结果:

Traceback (most recent call last):

  File "<ipython-input-89-8838ce8b0d7f>", line 1, in <module>
    print(xmltodict.unparse(y2,pretty=True))

  File "/Users/luzazul/anaconda/lib/python3.4/site-packages/xmltodict.py", line 323, in unparse
    raise ValueError('Document must have exactly one root.')

ValueError: Document must have exactly one root.

Any help would be greatly appreciated, thanks! 任何帮助将不胜感激,谢谢!

Assuming you've cleaned up the input to make it valid (see comment on question)... 假设您已经清理了输入以使其有效(请参阅问题注释)...

It looks like xmltodict is trying to make a markers element for each item in the list, and since markers is at the top level, you're trying to create multiple roots. 看起来xmltodict试图为列表中的每个项目创建一个markers元素,并且由于markers在顶层,因此您试图创建多个根。

I would go about it by adding a top level element around the data like this: 我将通过在数据周围添加一个顶级元素来解决这个问题:

y2 = {'root':y2}

You can use the xmljson library to convert using different XML JSON conventions . 您可以使用xmljson库使用不同的XML JSON约定进行转换。 It supports multiple roots by returning an array of Elements. 它通过返回元素数组来支持多个根。

For example: 例如:

>>> import xmljson
>>> xmljson.badgerfish.etree({'x': 1, 'y': 2})
[<Element y at 0x3114a08>, <Element x at 0x3114a48>]

-- both x and y elements are returned. -同时返回xy元素。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM