通过解析所有自定义定义和引用,将 XSD 架构转换为其原子形式

Turn XSD schema into its atomic form by resolving all custom definitions and refs

提问人:yumba 提问时间:7/29/2023 更新时间:7/29/2023 访问量:40

问:

有没有一种简单的方法可以将包含一堆自定义类型定义和引用的 XSD 架构转换为“最终结果”,如果您“解析”所有这些自定义定义并将它们放在它们应该在的位置,您将得到该结果。

换句话说:生成相同的架构,但编写得好像不允许使用自定义类型定义和引用一样。当XML文件根据模式进行评估时,我想知道这是否是在某个时候“在引擎盖下”发生的事情。

我该如何转动这个:

<xs:schema>
 <xs:simpleType name="STRING_MAX_200">
  <xs:restriction base="xs:string">
   <xs:maxLength value="200"/>
  </xs:restriction>
 </xs:simpleType>

 <xs:complexType name="NAME_TYPE">
  <xs:sequence>
   <xs:element name="firstName" type="STRING_MAX_200"/>
   <xs:element name="middleName" type="STRING_MAX_200" minOccurs="0"/>
  </xs:sequence>
 </xs:complexType>

 <xs:element name="signature" type="NAME_TYPE"/>

</xs:schema>

进入这个

<xs:schema>
 <xs:element name="signature">
  <xs:sequence>
   <xs:element name="firstName">
    <xs:restriction base="xs:string">
     <xs:maxLength value="200"/>
    </xs:restriction>
   </xs:element>

   <xs:element name="middleName" minOccurs="0">
    <xs:restriction base="xs:string">
     <xs:maxLength value="200"/>
    </xs:restriction>
   </xs:element>
  </xs:sequence>
 </xs:element>
</xs:schema>

xml xsd xml 解析

评论

0赞 Yitzhak Khabinsky 7/29/2023
没有必要这样做。您只需定义一次自己的类型,并在适用的情况下重用它。如果您需要进行更改,只需在一个地方进行一次更改。
0赞 yumba 7/29/2023
是的,但我需要这种“完全解析的模式”用于其他目的。我意识到没有必要根据它来验证 XML 文件:)

答:

1赞 Michael Kay 7/29/2023 #1

架构处理器在“后台”执行的操作可能恰恰相反,它可能会将所有匿名类型转换为具有系统分配名称的命名类型。

您的方法的主要问题是 (a) 如果在多个位置使用类型定义,则内联移动类型定义将涉及重复,以及 (b) 如果从另一个类型定义引用类型(例如,通过扩展、限制、联合或列表派生的类型),则无法内联移动类型。

它也不适用于递归架构,其中子元素与其父元素具有相同的类型:如果您尝试扩展该内联,则递归不会终止。

评论

0赞 yumba 8/1/2023
谢谢!经过一番挖掘,我相信确实没有直接的方法来“内联”嵌套模式。只能通过编写自己的逻辑来完成。