使用模式、类型元素中的属性验证 XML
Validating XML using schema, attribute in type elements
我正在尝试使用模式验证以下 XML。
<?xml version="1.0" encoding="ISO-8859-1"?>
<Noticias xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="UXMLS-5.xsd">
<Noticia dia="12" mes="3" año="2004" seccion="Nacional">
<medio tipo="radio">Onda Cero</medio>
<periodista>Fermín Bocos</periodista>
<titular>Atentado bestial en Madrid</titular>
<resumen>Resumen de la noticia Atentado bestial en Madrid</resumen>
</Noticia>
</Noticias>
我在验证上面的下面一行时卡住了:
<medio tipo="radio">Onda Cero</medio>
我能够验证 "Noticia",它具有属性,因为它不是具有关联类型的最终元素,但当它是具有关联内容的子元素时我不能。
我尝试了很多方法,到目前为止运气不佳,而且我无法在网上找到解决方案。有任何想法吗?我是不是遗漏了什么,还是根本不可能做到?
更新:
到目前为止,这是 XSD,请记住 "medio" 位是错误的。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="Noticias">
<xs:complexType>
<xs:sequence>
<xs:element name="Noticia" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="medio" type="xs:string">
<xs:attribute name="tipo" type="xs:string">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="radio"/>
<xs:enumeration value="prensa"/>
<xs:enumeration value="television"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:element>
<xs:element name="periodista" type="xs:string"/>
<xs:element name="titular" type="xs:string"/>
<xs:element name="resumen">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z0-9]{60}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="dia" type="dia"/>
<xs:attribute name="mes" type="mes"/>
<xs:attribute name="año" type="xs:integer"/>
<xs:attribute name="seccion" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="dia">
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="12"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="mes">
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="31"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
您的验证标记有两个问题:
- 您的
xs:attribute
周围缺少 xs:complexType
和 xs:simpleContent
元素。还有一个 <xs:extension base="xs:string">
用于指定元素内容的值类型,例如 explained here at W3Schools.
因此 medio
代码应如下所示:
<xs:element name="medio">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="tipo">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="radio"/>
<xs:enumeration value="prensa"/>
<xs:enumeration value="television"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
另一个问题(不是你问题的一部分):你的 xs:pattern
应该是 1 到 60 个字符而不是恰好 60 个字符并且包括空格:
<xs:pattern value="[\sa-zA-Z0-9]{1,60}"/>
现在您的 XSD 应该可以正常工作了。
我正在尝试使用模式验证以下 XML。
<?xml version="1.0" encoding="ISO-8859-1"?>
<Noticias xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="UXMLS-5.xsd">
<Noticia dia="12" mes="3" año="2004" seccion="Nacional">
<medio tipo="radio">Onda Cero</medio>
<periodista>Fermín Bocos</periodista>
<titular>Atentado bestial en Madrid</titular>
<resumen>Resumen de la noticia Atentado bestial en Madrid</resumen>
</Noticia>
</Noticias>
我在验证上面的下面一行时卡住了:
<medio tipo="radio">Onda Cero</medio>
我能够验证 "Noticia",它具有属性,因为它不是具有关联类型的最终元素,但当它是具有关联内容的子元素时我不能。
我尝试了很多方法,到目前为止运气不佳,而且我无法在网上找到解决方案。有任何想法吗?我是不是遗漏了什么,还是根本不可能做到?
更新: 到目前为止,这是 XSD,请记住 "medio" 位是错误的。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="Noticias">
<xs:complexType>
<xs:sequence>
<xs:element name="Noticia" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="medio" type="xs:string">
<xs:attribute name="tipo" type="xs:string">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="radio"/>
<xs:enumeration value="prensa"/>
<xs:enumeration value="television"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:element>
<xs:element name="periodista" type="xs:string"/>
<xs:element name="titular" type="xs:string"/>
<xs:element name="resumen">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z0-9]{60}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="dia" type="dia"/>
<xs:attribute name="mes" type="mes"/>
<xs:attribute name="año" type="xs:integer"/>
<xs:attribute name="seccion" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="dia">
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="12"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="mes">
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="31"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
您的验证标记有两个问题:
- 您的
xs:attribute
周围缺少xs:complexType
和xs:simpleContent
元素。还有一个<xs:extension base="xs:string">
用于指定元素内容的值类型,例如 explained here at W3Schools.
因此 medio
代码应如下所示:
<xs:element name="medio">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="tipo">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="radio"/>
<xs:enumeration value="prensa"/>
<xs:enumeration value="television"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
另一个问题(不是你问题的一部分):你的
xs:pattern
应该是 1 到 60 个字符而不是恰好 60 个字符并且包括空格:<xs:pattern value="[\sa-zA-Z0-9]{1,60}"/>
现在您的 XSD 应该可以正常工作了。