在java中解析多个xsd文件

时间:2013-12-01 16:51:33

标签: java xml-parsing xsd

我正在研究一个模块,通过读取xsd文件来生成动态表单。首先,我需要找到所有必需/可选元素及其字段限制和数据类型。在Schema中,可以有可以引用其他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中获取列名。

1 个答案:

答案 0 :(得分:0)

  

所以我的问题是如何从我拥有的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中许多深奥语句的指南。
  3. 最后,请注意XML中的其他表单工作,例如XFormsXFA