如何使用属性限制 complexType 中的元素内容?
How to restrict element content inside a complexType with attributes?
我正在尝试在 XSD 的帮助下验证 XML。
这是我的示例 XML:
<Cells
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation= "ImportCellsXSD.xsd">
<Cell spread="2" row="128" column="51">p</Cell>
<Cell spread="0" row="10" column="1">ea</Cell>
<Cell spread="0" row="8" column="2">d</Cell>
</Cells>
这是我的 XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" attributeFormDefault="unqualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Cells">
<xs:complexType>
<xs:sequence>
<xs:element name="Cell" type="TCell" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="TCell">
<xs:sequence>
<xs:element name="Cell" type="TCellValidation" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="spread" type="TSpread" use="required"/>
<xs:attribute name="row" type="TRow" use="required"/>
<xs:attribute name="column" type="TColumn" use="required"/>
</xs:complexType>
<xs:simpleType name="TCellValidation">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Za-z0-9]+"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
TSpread
、TColumn
和 TRow
只是对 minInclusive
和 maxInclusive
的验证
当我尝试验证 xml 时,我在尝试读取 "p" 、 "ea" 和 "d"
时遇到此错误
cvc-complex-type.2.3: Element 'Cell' cannot have character [children],
because the type's content type is element-only. [6]
cvc-complex-type.2.4.b: The content of element 'Cell' is not complete.
One of '{Cell}' is expected. [6]
如何定义cell
的内容? (p, ea 和 d)
您的 XSD 要求 Cell
元素位于 Cell
元素内——可能不是您想要的,而且绝对不是您的 XML 所拥有的。
这是您的 XSD 解决方案以消除上述问题并验证您的 XML:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" attributeFormDefault="unqualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Cells">
<xs:complexType>
<xs:sequence>
<xs:element name="Cell" type="TCell" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="TCell">
<xs:simpleContent>
<xs:extension base="TCellValidation">
<xs:attribute name="spread" type="xs:string" use="required"/>
<xs:attribute name="row" type="xs:string" use="required"/>
<xs:attribute name="column" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="TCellValidation">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Za-z0-9]+"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
(TSpread
, TColumn
和 TRow
没有在你发布的 XSD 中定义,所以我把它们存根为 xs:string
,但是原理保持不变。)
我正在尝试在 XSD 的帮助下验证 XML。
这是我的示例 XML:
<Cells
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation= "ImportCellsXSD.xsd">
<Cell spread="2" row="128" column="51">p</Cell>
<Cell spread="0" row="10" column="1">ea</Cell>
<Cell spread="0" row="8" column="2">d</Cell>
</Cells>
这是我的 XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" attributeFormDefault="unqualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Cells">
<xs:complexType>
<xs:sequence>
<xs:element name="Cell" type="TCell" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="TCell">
<xs:sequence>
<xs:element name="Cell" type="TCellValidation" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="spread" type="TSpread" use="required"/>
<xs:attribute name="row" type="TRow" use="required"/>
<xs:attribute name="column" type="TColumn" use="required"/>
</xs:complexType>
<xs:simpleType name="TCellValidation">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Za-z0-9]+"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
TSpread
、TColumn
和 TRow
只是对 minInclusive
和 maxInclusive
当我尝试验证 xml 时,我在尝试读取 "p" 、 "ea" 和 "d"
时遇到此错误cvc-complex-type.2.3: Element 'Cell' cannot have character [children], because the type's content type is element-only. [6] cvc-complex-type.2.4.b: The content of element 'Cell' is not complete. One of '{Cell}' is expected. [6]
如何定义cell
的内容? (p, ea 和 d)
您的 XSD 要求 Cell
元素位于 Cell
元素内——可能不是您想要的,而且绝对不是您的 XML 所拥有的。
这是您的 XSD 解决方案以消除上述问题并验证您的 XML:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" attributeFormDefault="unqualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Cells">
<xs:complexType>
<xs:sequence>
<xs:element name="Cell" type="TCell" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="TCell">
<xs:simpleContent>
<xs:extension base="TCellValidation">
<xs:attribute name="spread" type="xs:string" use="required"/>
<xs:attribute name="row" type="xs:string" use="required"/>
<xs:attribute name="column" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="TCellValidation">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Za-z0-9]+"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
(TSpread
, TColumn
和 TRow
没有在你发布的 XSD 中定义,所以我把它们存根为 xs:string
,但是原理保持不变。)