【问题标题】:How to get datatypes from XSD generic如何从 XSD 泛型获取数据类型
【发布时间】:2019-12-27 19:46:19
【问题描述】:

我想获取 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 获取带有接口 XSElementDeclaration 的对象 XSParticleDecl

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

【问题讨论】:

  • XSD 就是 XML。查看有关如何处理 XML 的一些教程。一个简单的解决方案是制作一个对 XML 进行建模的 Pojo,然后将其反序列化。
  • @user489041 我知道 XSD 的定义,但搜索起来不一样。由于泛型,Pojo 不是解决方案。
  • @Faer 你能用Xerces 做到吗?我需要在我的应用程序中实现类似的东西。我需要从 XSD 中获取 XML 中对象的数据类型。如果有小代码sn-p可以发在这里吗?

标签: java xml types xsd xerces


【解决方案1】:

通常最好使用模式处理器,让您可以对“模式组件模型”进行某种访问,而不是直接使用源 XSD 文档。

Xerces 架构 API 是一种方法,但我没有这方面的经验,因此无法为您提供帮助。

Saxon 提供了两种选择:

(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 是对 @id 属性的引用scm:simpleTypescm:complexType scm:schema 元素的子元素。

【讨论】:

  • 感谢您的回答。学到了一些新东西,但我不想添加额外的转换步骤。我对 XSD 的情况很感兴趣 :)
猜你喜欢
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多