XSD 交替元素
XSD for Alternating Elements
我有以下 XML 如下所示:
<?xml version="1.0" encoding="utf-8"?>
<main>
<bbcor Location="string" Name="string">
<PipeDiameter_INCH>3.1415926535</PipeDiameter_INCH>
<InitialPressure_PSI>3335.566</InitialPressure_PSI>
<LWISE TotalSection="2">
<DL_FT>535.00</DL_FT> <HL_FT>653.00</HL_FT>
<DL_FT>245.98</DL_FT> <HL_FT>395.0</HL_FT>
</LWISE>
</bbcor>
</main>
我正在尝试为上述文件制作一个 XSD 验证器,但卡在交替元素中,即
<DL_FT>2.4</DL_FT> <HL_FT>234.00</HL_FT>
<DL_FT>3.5</DL_FT> <HL_FT>456.00</HL_FT>
<DL_FT>6.8</DL_FT> <HL_FT>678.00</HL_FT>
我尝试了在线生成器等,但 none 提供了所需的 XSD。当前XSD文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="main">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="bbcor">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="PipeDiameter_INCH" type="xsd:decimal" />
<xsd:element name="InitialPressure_PSI" type="xsd:decimal" />
<xsd:element name="LWISE">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="DL_FT" type="xsd:decimal" />
<xsd:element maxOccurs="unbounded" name="HL_FT" type="xsd:decimal" />
</xsd:sequence>
<xsd:attribute name="TotalSection" type="xsd:int" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="Location" type="xsd:string" />
<xsd:attribute name="Name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
以上XSD有什么问题?我正在使用 xmllint 来验证上面的 XML 文件。
XSD 是否不允许交替元素?当
之类的元素出现时它起作用了
<DL_FT>2.45</DL_FT>
<DL_FT>2.44</DL_FT>
<DL_FT>2.35</DL_FT>
<HL_FT>245</HL_FT>
<HL_FT>445</HL_FT>
<HL_FT>545</HL_FT>
你们很亲近。只需 将 maxOccurs="unbounded"
分解为 xsd:sequence
.
具体来说,改变
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="DL_FT" type="xsd:decimal" />
<xsd:element maxOccurs="unbounded" name="HL_FT" type="xsd:decimal" />
</xsd:sequence>
到
<xsd:sequence maxOccurs="unbounded">
<xsd:element name="DL_FT" type="xsd:decimal" />
<xsd:element name="HL_FT" type="xsd:decimal" />
</xsd:sequence>
因为DL_FT
-HL_FT
对意味着要无限期地重复。
更新:
半双
我没有提到上面的解决方案很简单只是是不对的,因为你的例子是基于对的。 (感谢 Michael Kay 的提醒。)如果您需要允许未配对的散兵游勇,例如正常配对后的单独 DL_FT
散兵游勇,
<DL_FT>2.4</DL_FT> <HL_FT>234.00</HL_FT>
<DL_FT>3.5</DL_FT> <-- no HL_FT here -->
您将 运行 陷入经典的、模棱两可的内容模型问题,并且无法通过 XSD 检查此类模式。然而,RELAX NG 可以表示模式。
我有以下 XML 如下所示:
<?xml version="1.0" encoding="utf-8"?>
<main>
<bbcor Location="string" Name="string">
<PipeDiameter_INCH>3.1415926535</PipeDiameter_INCH>
<InitialPressure_PSI>3335.566</InitialPressure_PSI>
<LWISE TotalSection="2">
<DL_FT>535.00</DL_FT> <HL_FT>653.00</HL_FT>
<DL_FT>245.98</DL_FT> <HL_FT>395.0</HL_FT>
</LWISE>
</bbcor>
</main>
我正在尝试为上述文件制作一个 XSD 验证器,但卡在交替元素中,即
<DL_FT>2.4</DL_FT> <HL_FT>234.00</HL_FT>
<DL_FT>3.5</DL_FT> <HL_FT>456.00</HL_FT>
<DL_FT>6.8</DL_FT> <HL_FT>678.00</HL_FT>
我尝试了在线生成器等,但 none 提供了所需的 XSD。当前XSD文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="main">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="bbcor">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="PipeDiameter_INCH" type="xsd:decimal" />
<xsd:element name="InitialPressure_PSI" type="xsd:decimal" />
<xsd:element name="LWISE">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="DL_FT" type="xsd:decimal" />
<xsd:element maxOccurs="unbounded" name="HL_FT" type="xsd:decimal" />
</xsd:sequence>
<xsd:attribute name="TotalSection" type="xsd:int" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="Location" type="xsd:string" />
<xsd:attribute name="Name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
以上XSD有什么问题?我正在使用 xmllint 来验证上面的 XML 文件。 XSD 是否不允许交替元素?当
之类的元素出现时它起作用了<DL_FT>2.45</DL_FT>
<DL_FT>2.44</DL_FT>
<DL_FT>2.35</DL_FT>
<HL_FT>245</HL_FT>
<HL_FT>445</HL_FT>
<HL_FT>545</HL_FT>
你们很亲近。只需 将 maxOccurs="unbounded"
分解为 xsd:sequence
.
具体来说,改变
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="DL_FT" type="xsd:decimal" />
<xsd:element maxOccurs="unbounded" name="HL_FT" type="xsd:decimal" />
</xsd:sequence>
到
<xsd:sequence maxOccurs="unbounded">
<xsd:element name="DL_FT" type="xsd:decimal" />
<xsd:element name="HL_FT" type="xsd:decimal" />
</xsd:sequence>
因为DL_FT
-HL_FT
对意味着要无限期地重复。
更新:
半双
我没有提到上面的解决方案很简单只是是不对的,因为你的例子是基于对的。 (感谢 Michael Kay 的提醒。)如果您需要允许未配对的散兵游勇,例如正常配对后的单独 DL_FT
散兵游勇,
<DL_FT>2.4</DL_FT> <HL_FT>234.00</HL_FT>
<DL_FT>3.5</DL_FT> <-- no HL_FT here -->
您将 运行 陷入经典的、模棱两可的内容模型问题,并且无法通过 XSD 检查此类模式。然而,RELAX NG 可以表示模式。