我需要编写一个XML Schema,它允许生成需要采用非常特定格式的XML文件。我希望使用XML Schema和JAXB来创建数据对象,写入数据对象,然后将该数据对象封送到正确形成的XML中。
不幸的是,没有这个XML文档的模式,一些遗留代码以非常手动的方式读取该模式。因此,目标是创建一个XML Schema,允许JAXB以这种非常具体的方式进行编组。
我遇到了一个专门针对命名集合或数组的问题。我对此有一些变化,下面是最复杂的版本。
请注意,我无法控制目标所需的XML格式,因此我需要了解如何指示架构以便生成此格式。任何和所有建议都非常非常有用,我保证,XML架构专家,如果有人帮助我,那么他们将是我本周最喜欢的人!
以下是目标格式:
<BetaInfo name="Beta ID" value="1">
<SimpleBetaInfo>
<Param name="Simple Beta A" value="Beta ID 1, Param A data"/>
<Param name="Simple Beta B" value="Beta ID 1, Param B data"/>
</SimpleBetaInfo>
<ListBetaInfo name="List ID" value="1">
<Param name="Item 1" value="Beta ID 1, List Index 1, Item 1 data"/>
<Param name="Item 2" value="Beta ID 1, List Index 1, Item 2 data"/>
</ListBetaInfo>
<ListBetaInfo name="List ID" value="2">
<Param name="Item 1" value="Beta ID 1, List Index 2, Item 1 data"/>
<Param name="Item 2" value="Beta ID 1, List Index 2, Item 2 data"/>
</ListBetaInfo>
</BetaInfo>
答案 0 :(得分:0)
这可能是一个起点。它描述了您提供的实例的结构,您可以对其进行调整以支持子元素的出现。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:attributeGroup name="commonAttributes">
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="value" type="xs:string"/>
</xs:attributeGroup>
<xs:element name="BetaInfo">
<xs:complexType>
<xs:sequence>
<xs:element name="SimpleBetaInfo" type="BetaInfoType" minOccurs="1" maxOccurs="1" />
<xs:element name="ListBetaInfo" type="BetaInfoType" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attributeGroup ref="commonAttributes"/>
</xs:complexType>
</xs:element>
<xs:complexType name="BetaInfoType">
<xs:sequence>
<xs:element name="Param" minOccurs="2" maxOccurs="2">
<xs:complexType>
<xs:attributeGroup ref="commonAttributes"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attributeGroup ref="commonAttributes"/>
</xs:complexType>
</xs:schema>
然而,上述模式不限制可以使用正则表达式完成的属性内容的结构,也不限制不同字段中的数据之间的关系(这将需要JAX中当前不支持的XSD 1.1)