【问题标题】:Parse an XSD file using python使用 python 解析 XSD 文件
【发布时间】:2019-02-14 10:08:08
【问题描述】:

我正在尝试从给定的 XML 模式生成 XML 文件。我已经能够使用 python 中的 pyxb 库来做到这一点。但问题是随着 XSD 变得巨大,不可能手动编码每个标签。是否有任何 python 库可以从给定的 XSD 文件创建一个可以迭代的数据结构

【问题讨论】:

  • 你能提供 XML 架构吗?
  • 我无法为您提供我正在处理的原始 xml 架构,但 docs.microsoft.com/en-us/dotnet/csharp/programming-guide/… 的 xml 架构或多或少具有相同的结构,唯一的区别是大小。我的更大
  • 那么你想根据XSD生成带有随机数据的XML文件吗?
  • 我想生成一个 xml,其中一些字段将由我的 UI 填充,其余字段可以填充虚拟数据。即使有一种基于 XSD 生成带有随机数据的 XML 的方法,它也将有助于在很大程度上解决我的目的。

标签: python xml parsing data-structures xsd


【解决方案1】:

这个库似乎做你想做的事:https://pypi.org/project/xmlschema/

浏览文档后,我发现了以下代码示例:https://xmlschema.readthedocs.io/en/latest/usage.html#xsd-declarations

>>> import xmlschema
>>> from pprint import pprint
>>> schema = xmlschema.XMLSchema('xmlschema/tests/test_cases/examples/vehicles/vehicles.xsd')
>>> schema.types
NamespaceView({'vehicleType': XsdComplexType(name='vehicleType')})
>>> pprint(dict(schema.elements))
{'bikes': XsdElement(name='vh:bikes', occurs=[1, 1]),
 'cars': XsdElement(name='vh:cars', occurs=[1, 1]),
 'vehicles': XsdElement(name='vh:vehicles', occurs=[1, 1])}
>>> schema.attributes
NamespaceView({'step': XsdAttribute(name='vh:step')})

所以它看起来可以用来创建一个 python 数据结构,你可以从 XSD 文件中迭代。

这个问题也可能是相关的:How to convert XSD to Python Class

【讨论】:

  • 我仍然无法弄清楚该怎么做。我有一本包含所有标签名称及其限制的字典。怎么把它转成xml文件还是让我莫名其妙
  • xmlschema库支持转换成python字典,非常爽。
【解决方案2】:

xsdata 从 XML 模式生成 dataclasses。它还可以将数据类呈现为 XML。可以通过向构造函数提供所有命名参数(可以使用 mypy 或 pylance 静态检查)或使用字典和 dacite 来实例化数据类。

正如FAQ 中所解释的,最好使用 Python 3.10,以便必填字段成为构造函数的必填参数。为此,请执行xsdata init-config 并在.xsdata.xml 中设置kwOnly=true

【讨论】:

    【解决方案3】:

    您可以从 XSD 文件生成 XML 文件:

    import requests
    
    with open('file.xsd', 'r') as f:
        data = f.read()
    r = requests.post('https://www.liquid-technologies.com/api/Converter', json={"Filename": "schema.xsd", "Type": "xsd", "Data": data, "TargetType": "xml", "Arguments": {"elementName": "Root", "elementNamespace": "", "addAnyAttributes": False, "addAnyElements": False, "forceOptionItemsToDepthOf": "4", "forceXsiNamespaceDelaration": False, "maxDepthToCreateOptionalItems": "7", "indent": "2", "indentChar": " ", "indentAttributes": False, "seed": "9722"}})
    with open('file.xml', 'w') as f:
        f.write(r.json()['Files'][0]['Data'])
    

    【讨论】:

    • 仍然不能解决我的目的......我需要在 python 中明确地帮助我生成 xml 文件
    • 你能解释一下这里发生了什么吗?你是怎么做到的?
    • 在输入时,您有 file.xsd 和 XSD 架构。在输出时,您会得到从该 XML 生成的“file.xml”。
    • 您是如何获得此 API 的,是否有任何文档可供我查阅以使其根据需要工作?
    • 没有文档,但您可以查看他们的website 了解更多信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多