0

最终,我想在 Flask 应用程序中基于 XSD 模式构建一个示例 xml 文件,然后将输入导出为有效的 xml 文件。

我也在使用 xmlschema 包。

我有一个烧瓶应用程序和页面的基本结构,其中包含一个显示 XSD 元素的下拉菜单。

@app.route('/xml_builder')
def xml_builder():
    xs = xmlschema.XMLSchema('schema_file.xsd')
    dict = sorted(xs.maps.elements.keys())

    return render_template('public/xml-builder.html', get = dict)

但是,我正在努力获取/理解如何使其仅显示来自主 xsd 的元素(模式 file.xsd,如下所述) - 从下拉菜单中选择该元素时,它应该显示相关的子元素/ 来自其他 xsd 文件(schema_types.xsd,如下所述)的属性作为标签,旁边有一个文本字段,允许用户输入一个值。

架构由多个架构组成

schema_file.xsd 是主模式,描述了 xml 文件的结构

<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema
            attributeFormDefault="unqualified"
            elementFormDefault="qualified"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="schema_types.xsd" />

<xsd:complexType name="InfoData">
        <xsd:sequence>
            <xsd:element name="Shop"
                         type="test:ShopType"
                         maxOccurs="unbounded" />
            <xsd:element name="Town"
                         type="test:TownType"
                         minOccurs="0"
                         maxOccurs="unbounded" />
           </xsd:element>
        </xsd:sequence>
</xsd:complexType>
</xsd:schema>

并且 schema_types.xsd 文件包含元素的结构

<xsd:complexType name="ShopType">
        <xsd:sequence>
            <xsd:element name="Country"
                         type="xsd:string"
                         minOccurs="0">
            </xsd:element>
            <xsd:element name="City"
                         type="xsd:string"
                         minOccurs="0">
            </xsd:element>
            <xsd:element name="Note"
                         type="xsd:string"
                         minOccurs="0"
                         maxOccurs="unbounded">
            </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="id"
                       type="xsd:string"
                       use="required">
        </xsd:attribute>
        <xsd:attribute name="name"
                       type="xsd:string"
                       use="required">
        </xsd:attribute>
    </xsd:complexType>

任何方向/指导将不胜感激

4

1 回答 1

1

“主架构”和“其他 xsd 文件”之间的区别特定于您的场景。XML Schema 没有这样的区别,我希望 xmlschema Python 模块也不会。

如果可能,您应该为主模式声明一个 targetNamespace,并为子元素模式声明一个不同的 targetNamespace。您还需要将 xs:include 更改为 xs:import。然后您可以根据它们的命名空间选择元素。

请记住,此解决方案将非常特定于您自己的架构。XSD 的通用示例文档生成器是一个大项目。

于 2020-04-01T15:42:10.753 回答