我有一个XML和相应的XSD如下:
myXSD.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com/myXSD"
xmlns="http://www.example.com/myXSD"
elementFormDefault="qualified">
<xs:element name="RootElem">
<xs:complexType>
<xs:sequence>
<xs:element name="Insider1">
<xs:complexType>
<xs:sequence>
<xs:element ref="Internal" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Insider2">
<xs:complexType>
<xs:sequence>
<xs:element ref="Internal" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Insider3">
<xs:complexType>
<xs:sequence>
<xs:element ref="Internal" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Internal-low">
<xs:complexType>
<xs:sequence>
<xs:element name="myString" type="xs:string" maxOccurs="unbounded"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Internal">
<xs:complexType>
<xs:sequence>
<xs:element name="Step" type="xs:string"></xs:element>
<xs:element ref="Internal-low" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
myXML.xml:
<?xml version="1.0" encoding="UTF-8"?>
<RootElem xmlns="http://www.example.com/myXSD"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/myXSD myXSD.xsd">
<Insider1>
<Internal>
<Step>My step 1</Step>
<Internal-low>
<myString>My string 1 for step 1</myString>
</Internal-low>
</Internal>
<Internal>
<Step>My step 2</Step>
<Internal-low>
<myString>My string 1 for step 2</myString>
</Internal-low>
</Internal>
<Internal>
<Step>My step 3</Step>
<Internal-low>
<myString>My string 1 for step 3</myString>
<myString>My string 2 for step 3</myString>
</Internal-low>
</Internal>
</Insider1>
<Insider2>
<Internal>
<Step>My step 1</Step>
<Internal-low>
<myString>My string 1 for step 1</myString>
</Internal-low>
</Internal>
<Internal>
<Step>My step 2</Step>
<Internal-low>
<myString>My string 1 for step 2</myString>
</Internal-low>
</Internal>
<Internal>
<Step>My step 3</Step>
<Internal-low>
<myString>My string 1 for step 3</myString>
<myString>My string 2 for step 3</myString>
</Internal-low>
</Internal>
</Insider2>
<Insider3>
<Internal>
<Step>My step 1</Step>
<Internal-low>
<myString>My string 1 for step 1</myString>
</Internal-low>
</Internal>
<Internal>
<Step>My step 2</Step>
<Internal-low>
<myString>My string 1 for step 2</myString>
</Internal-low>
</Internal>
<Internal>
<Step>My step 3</Step>
<Internal-low>
<myString>My string 1 for step 3</myString>
<myString>My string 2 for step 3</myString>
</Internal-low>
</Internal>
</Insider3>
</RootElem>
这里一切正常。问题在于InsiderX
元素。我的实际XSD中大约有10个InsiderX
个元素可能会随着时间的推移而增加。所以我需要压缩XSD代码,以便添加或删除任何InsiderX
元素更简单,因为这样做现在需要添加/删除7行冗余代码。我怎样才能确保每个InsiderX
元素中只有一个出现在我的XML中。
此外,我想知道XSD中有哪些其他选项可以替换<xs:sequence>
。我不想替代这个,但想知道其他可能的选项,如<xs:choice>
。
答案 0 :(得分:1)
我需要压缩XSD代码,以便添加或删除任何代码 InsiderX元素更简单,因为这样做现在需要添加/删除7 冗余代码行
您可以通过创建这样的可重用类型来缩短XSD。
<xs:complexType name="InsiderXType">
<xs:sequence>
<xs:element ref="Internal" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:element name="RootElem">
<xs:complexType>
<xs:sequence>
<xs:element name="Insider1" type="InsiderXType"/>
<xs:element name="Insider2" type="InsiderXType"/>
<xs:element name="Insider3" type="InsiderXType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
如何确保每个InsiderX中只有一个 元素出现在我的XML
中
您已经使用原始架构介绍了此方案。通过复制 Insider1 节点来修改XML文档,例如像
<Insider1>
...
</Insider1>
<Insider1>
...
</Insider1>
<Insider2>
...
并尝试针对您的架构验证这一点。您将收到如下错误: cvc-complex-type.2.4.a:从元素'Insider1'开始发现无效内容。其中一个是{{http://www.example.com/myXSD“:Insider2}'。
我想知道要替换的XSD中还有哪些其他选项 &LT; XS:序列&GT;
嗯,我不知道如何回答这个问题,因为这个问题确实过于宽泛,但请查看复杂类型定义的XML Schema specification。它表示您可以使用 group , all 或 choice 而不是序列。我希望这会让你走上正轨。
答案 1 :(得分:0)
我认为它是可撤销的,处理这种情况的更好方法是在你的xml中有:
<Insider name="Insider1">
而不是
<Insider1>
编辑:(限制名称属性值)
<attribute name="name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="Insider[0-9]*"/>
</xs:restriction>
</xs:simpleType>
</attribute>