繁体   English   中英

如何从XSD泛型获取数据类型

[英]How to get datatypes from XSD generic

我想获取XSD的数据类型。 它必须是静态的,因为XSD可能是变量。 就我而言,我知道元素名称。

XSD的小样本,但可能会更深入:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Order">
    <xs:complexType>
      <xs:sequence>
        <xs:element type="xs:float" name="OrderNo"/>
        <xs:element type="xs:string" name="OrderDate"/>
        <xs:element type="xs:string" name="Name"/>
        <xs:element type="xs:float" name="NameNo"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

我尝试了org.apache.xerces.xs但不知道如何从根Elem XSParticleDecl带有接口XSElementDeclaration的Object XSParticleDecl

我希望每个单独元素名称的输出都是该类型。

通常,最好与可为您提供对“架构组件模型”某种访问方式的模式处理器一起使用,而不是直接与源XSD文档一起使用。

Xerces模式API是一种方法,但是我没有经验,也无法为您提供帮助。

撒克逊人提供两种选择:

(a)您可以生成一个代表编译模式的SCM文件。 这是一个XML文件,因此可以使用XSLT或XQuery轻松处理。

(b)有一组扩展功能,从saxon:schema()开始,使您可以直接从XPath探索模式。

我将亲自处理SCM文件。 模式的SCM文件为:

<?xml version="1.0" encoding="UTF-8"?>
<scm:schema xmlns:scm="http://ns.saxonica.com/schema-component-model"
            generatedAt="2019-08-22T18:14:23.59+01:00"
            xsdVersion="1.1">
   <scm:element id="C0"
                name="Order"
                type="C1"
                global="true"
                nillable="false"
                abstract="false"/>
   <scm:complexType id="C1"
                    base="#anyType"
                    derivationMethod="restriction"
                    abstract="false"
                    variety="element-only">
      <scm:modelGroupParticle minOccurs="1" maxOccurs="1">
         <scm:sequence>
            <scm:elementParticle minOccurs="1" maxOccurs="1" ref="C2"/>
            <scm:elementParticle minOccurs="1" maxOccurs="1" ref="C3"/>
            <scm:elementParticle minOccurs="1" maxOccurs="1" ref="C4"/>
            <scm:elementParticle minOccurs="1" maxOccurs="1" ref="C5"/>
         </scm:sequence>
      </scm:modelGroupParticle>
      <scm:finiteStateMachine initialState="0">
         <scm:state nr="0">
            <scm:edge term="C2" to="1"/>
         </scm:state>
         <scm:state nr="1">
            <scm:edge term="C3" to="2"/>
         </scm:state>
         <scm:state nr="2">
            <scm:edge term="C4" to="3"/>
         </scm:state>
         <scm:state nr="3">
            <scm:edge term="C5" to="4"/>
         </scm:state>
         <scm:state nr="4" final="true"/>
      </scm:finiteStateMachine>
   </scm:complexType>
   <scm:element id="C2"
                name="OrderNo"
                type="#float"
                global="false"
                containingComplexType="C1"
                nillable="false"
                abstract="false"/>
   <scm:element id="C3"
                name="OrderDate"
                type="#string"
                global="false"
                containingComplexType="C1"
                nillable="false"
                abstract="false"/>
   <scm:element id="C4"
                name="Name"
                type="#string"
                global="false"
                containingComplexType="C1"
                nillable="false"
                abstract="false"/>
   <scm:element id="C5"
                name="NameNo"
                type="#float"
                global="false"
                containingComplexType="C1"
                nillable="false"
                abstract="false"/>
</scm:schema>
<?Σ 954c7f5b?>

内置类型使用例如type =“#float”表示,而用户定义的类型将由诸如type="C89"的引用表示,其中C89是对scm:simpleType@id属性的引用scm:simpleType scm:schema元素的scm:simpleTypescm:complexType子级。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM