【问题标题】:Convert Json to XML properly将 Json 正确转换为 XML
【发布时间】:2017-07-05 16:41:45
【问题描述】:

我有以下字典结构

[{
    "Body" : [{
        "Universal Lift Support" : ["1\"-9\" Extended Length",
                                    "10\"-14.5\" Extended Length",
                                    "15\"-19\" Extended Length",
                                    "20\" + Extended Length"]
    }]

我想使用 dicttoxml 库来获得所需的 xml 输出,例如:

<root>
    <Body>
        <Universal Lift Support>
            1"-9" Extended Length
            10"-14.5" Extended Length
            15"-19" Extended Length
            20" + Extended Length
        </Universal Lift Support>

但是,应用下一个代码后:

dicttoxml.dicttoxml(result, attr_type=False, root=True)

我得到了类似的 xml 结构:

&lt;?xml version="1.0" encoding="UTF-8" ?&gt;&lt;root&gt;&lt;item&gt;&lt;Body&gt;&lt;item&gt;&lt;Universal_Lift_Support&gt;&lt;item&gt;1&amp;quot;-9&amp;quot; Extended Length&lt;/item&gt;&lt;item&gt;10&amp;quot;-14.5&amp;quot; Extended Length&lt;/item&gt;&lt;item&gt;15&amp;quot;-19&amp;quot; Extended Length&lt;/item&gt;&lt;item&gt;

哪些选项可以帮助格式化和获取上述输出?

【问题讨论】:

  • 如果您指的是 ...,您是否阅读过 dicttoxml 的文档,因为它是这么说的。请参阅pypi.python.org/pypi/dicttoxml 或者如果您指的是“Universal Lift Support”变成“Universal_Lift_Support”的事实,那么您不能在 xml 标签中包含空格。或者,如果您指的是您的文本已放在单独的项目中,那么空格在 xml 中并不重要,所以也许这就是 dicttoxml 选择表示多行文本的方式。基本上,您的“所需”翻译既不是有效的 xml,也不是 dicttoxml 默认的

标签: python json xml python-3.x dicttoxml


【解决方案1】:

考虑使用遍历 json 对象并构建 XML 树的内置 Python 库(jsonxml.etree.ElementTree 和漂亮的打印,xml.dom.minidom)。需要注意的一点:XML 节点名称中不能包含空格,所以应该是&lt;UniversalLiftSupport&gt;

import json
import xml.etree.ElementTree as ET
import xml.dom.minidom

with open('BodyUniversal.json') as f:  
    jsondata = json.load(f)

# INITIALIZING XML DOC AND PARENT TAGS
root = ET.Element('root')
body = ET.SubElement(root, 'Body')
uls = ET.SubElement(body, 'UniversalLiftSupport')
uls.text = ''

# ITERATE THROUGH LIST, APPENDING TO XML
for i in jsondata[0]['Body'][0]['Universal Lift Support']:
    uls.text = uls.text + '\n\t\t\t' + i

# OUTPUT AND PRETTY PRINT TREE
tree_out = ET.tostring(root, encoding="UTF-8")
newXML = xml.dom.minidom.parseString(tree_out.decode('UTF-8'))
pretty_xml = newXML.toprettyxml()    

print(pretty_xml)
# <?xml version="1.0" ?>
# <root>
#         <Body>
#                 <UniversalLiftSupport>
#                         1&quot;-9&quot; Extended Length
#                         10&quot;-14.5&quot; Extended Length
#                         15&quot;-19&quot; Extended Length
#                         20&quot; + Extended Length</UniversalLiftSupport>
#         </Body>
# </root>

# OUTPUT XML CONTENT TO FILE
with open('Output.xml','w') as f:
    f.write(pretty_xml)

【讨论】:

    【解决方案2】:

    您可能必须编写一个函数来按照您想要的方式为列表生成 xml: https://github.com/quandyfactory/dicttoxml/blob/master/dicttoxml.py

    (见dicttoxml函数注释)

    似乎“whatever”模式是硬编码的,如果您使用 cdata=True,您将获得整个 '' 内容。

    【讨论】:

      【解决方案3】:

      如果该软件被称为dicttoxml,那么我认为期望它生成XML是合理的。你说你想要的输出不是 XML,所以这个工具不生成它也就不足为奇了。您似乎在抱怨该产品按锡上所说的那样做。

      【讨论】:

      • 不,我没有抱怨。我只是问是否可以使用该库或类似的 python 包获得输出
      • 如前所述,如果您想要非 XML 输出,请不要使用旨在生成 XML 的工具。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 2013-05-09
      相关资源
      最近更新 更多