【问题标题】:Parsing multiple xsd files in java在java中解析多个xsd文件
【发布时间】:2013-12-01 16:51:32
【问题描述】:

我正在开发一个通过读取 xsd 文件来生成动态表单的模块。首先,我需要找到所有必需/可选元素以及它们的字段限制和数据类型。在架构中可以有可以引用其他 xsd 文件的元素。我不确定如何处理这种情况。到目前为止,我能够从 xsd 文件中获取简单类型的元素,但是当 xsd 可以具有引用不同 xsd 文件的复杂元素时,我无法找到一种方法来处理这种情况。下面是我正在工作的 xsd 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://edd.att.com/cnmeddservice" targetNamespace="http://edd.att.com/cnmeddservice" elementFormDefault="qualified">
    <xsd:include schemaLocation="EDD_DataTypes.xsd"/>
    <xsd:include schemaLocation="EDD_Internal_DataTypes.xsd"/>
    <xsd:element name="RET_MAIL">
        <xsd:annotation>
            <xsd:documentation>Represents the eddbdsbatch request for RET_MAIL</xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="AccountNumber">
                    <xsd:simpleType>
                        <xsd:restriction base="xsd:string">
                            <xsd:maxLength value="15"/>
                        </xsd:restriction>
                    </xsd:simpleType>
                </xsd:element>
                <xsd:element name="cType">
                    <xsd:simpleType>
                        <xsd:restriction base="CtypeType">
                            <xsd:enumeration value="RET_MAIL"/>
                        </xsd:restriction>
                    </xsd:simpleType>
                </xsd:element>
                <xsd:element name="RequestId">
                    <xsd:simpleType>
                        <xsd:restriction base="xsd:integer">
                            <xsd:pattern value="[0-9]{1,9}"/>
                        </xsd:restriction>
                    </xsd:simpleType>
                </xsd:element>
                <xsd:element name="BillingId" minOccurs="0">
                    <xsd:simpleType>
                        <xsd:restriction base="xsd:string">
                            <xsd:maxLength value="12"/>
                        </xsd:restriction>
                    </xsd:simpleType>
                </xsd:element>
                <xsd:element name="BillingRegion" minOccurs="0">
                    <xsd:simpleType>
                        <xsd:restriction base="xsd:string">
                            <xsd:enumeration value="S"/>
                            <xsd:enumeration value="P"/>
                            <xsd:enumeration value="B"/>
                            <xsd:enumeration value="A"/>
                            <xsd:enumeration value="N"/>
                            <xsd:enumeration value="W"/>
                        </xsd:restriction>
                    </xsd:simpleType>
                </xsd:element>
                <xsd:element name="BillIndicator" minOccurs="0">
                    <xsd:simpleType>
                        <xsd:restriction base="xsd:string">
                            <xsd:enumeration value="LS"/>
                        </xsd:restriction>
                    </xsd:simpleType>
                </xsd:element>
                <xsd:element name="EmailAddress" minOccurs="0">
                    <xsd:simpleType>
                        <xsd:restriction base="xsd:string">
                            <xsd:maxLength value="75"/>
                        </xsd:restriction>
                    </xsd:simpleType>
                </xsd:element>
                <xsd:element name="AccountBalance" minOccurs="0">
                    <xsd:simpleType>
                        <xsd:restriction base="DecimalAmountType">
                        </xsd:restriction>
                    </xsd:simpleType>
                </xsd:element>
                <xsd:element name="BillAmount" minOccurs="0">
                    <xsd:simpleType>
                        <xsd:restriction base="DecimalAmountType">
                        </xsd:restriction>
                    </xsd:simpleType>
                </xsd:element>
                <xsd:element name="DateLastchecked" minOccurs="0">
                    <xsd:simpleType>
                        <xsd:restriction base="xsd:string">
                            <xsd:pattern value="((0[1-9]|1[012])/(0[1-9]|[12][0-9]|3[01])/(19|20)\d\d) ((0[0-9]|1[0-9]|2[0-4]):([0-5][0-9]):([0-5][0-9]))"/>
                        </xsd:restriction>
                    </xsd:simpleType>
                </xsd:element>
                <xsd:element name="PaymentDueDate" minOccurs="0">
                    <xsd:simpleType>
                        <xsd:restriction base="DateType"/>
                    </xsd:simpleType>
                </xsd:element>
                <xsd:element name="ctn">
                    <xsd:simpleType>
                        <xsd:restriction base="ContactNumberType">
                        </xsd:restriction>
                    </xsd:simpleType>
                </xsd:element>
                <xsd:element name="AlternateCTN" minOccurs="0">
                    <xsd:simpleType>
                        <xsd:restriction base="xsd:string">
                            <xsd:maxLength value="10"/>
                        </xsd:restriction>
                    </xsd:simpleType>
                </xsd:element>
                <xsd:element name="AltPhoneExtension" minOccurs="0">
                    <xsd:simpleType>
                        <xsd:restriction base="xsd:string">
                            <xsd:maxLength value="4"/>
                        </xsd:restriction>
                    </xsd:simpleType>
                </xsd:element>
                <xsd:element name="CustomerType">
                    <xsd:simpleType>
                        <xsd:restriction base="xsd:string">
                            <xsd:enumeration value="R"/>
                            <xsd:enumeration value="B"/>
                        </xsd:restriction>
                    </xsd:simpleType>
                </xsd:element>
            </xsd:sequence>
            <xsd:attribute name="clientIndicator" use="required">
                <xsd:simpleType>
                    <xsd:restriction base="ClientIndicatorType">
                        <xsd:enumeration value="Wireless_BDS"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:attribute>
            <xsd:attribute name="OverridePriorityString" use="optional">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:enumeration value="E"/>
                        <xsd:enumeration value="A"/>
                        <xsd:enumeration value="S"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:attribute>
            <xsd:attribute name="Languageid" use="optional">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:enumeration value="EN"/>
                        <xsd:enumeration value="ES"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:attribute>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

在上面的 xsd 中,我包含了两个不同的 xsds 文件(EDD_INTERNAL_DATATYPES 和 EDD_DATATYPES)。现在假设我有一个元素,它可以是一个包含 2-3 个元素的表格。现在在我的主要 xsd 文件中,我将有我的表名和列名的引用,我将在我包含的第二个 xsd 文件中给出。 所以我的问题是如何从我包含的 xsds 中获取列名。

【问题讨论】:

    标签: java xml-parsing xsd


    【解决方案1】:

    所以我的问题是如何从我拥有的 xsds 中获取列名 包括在内。

    您需要以与读取和处理根 XSD 相同的方式读取和处理包含的 XSD,并且您需要递归地执行此操作,因为包含的 XSD 还可能包含其他 XSD。

    但是,我建议您评估在表单工作中支持 XSD 中所有可能的构造所涉及的工作量。除了xsd:include,请注意任意 XSD 也可能使用:

    • xsd:import
    • xsd:extension / xsd:restriction
    • substitutionGroup

    也许您已经在处理这些问题,但要质疑相对简单的 xsd:include 语句的处理方式,表明您可能面临更大的复杂性。

    两个建议:

    1. 通过仅支持 XML Schema 的子集来缩小范围。
    2. 咨询一些久经沙场的来源,例如 Xerces-J 2 的来源 处理 XML Schema 中许多深奥语句的指南。

    最后,请注意 XML 中的其他表单工作,例如 XFormsXFA

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多