XSD 无法验证包含 dt:dt 属性的 XML
XSD unable to validate XML containing dt:dt attribute
XSD 文件无法验证包含 dt:dt
属性的 XML 文件。 XSD 文件不接受 dt:dt
属性。
例如
<xs:attribute name="dt:dt" type="xs:nonNegativeInteger" use="optional"/>
在上面 xs:attribute 中,不接受 dt:dt
名称。因此 XML 包含属性 dt:dt="10"
的文件无法验证。
是否有修改 XSD 以使 dt:dt
属性得到验证的解决方案?
XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<OperationalTopology xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xsi:noNamespaceSchemaLocation="xsd.xsd">
<Element1>
<Element1_In ID="xx" dt:dt="string"/>
</Element1>
</OperationalTopology>
XSD 文件:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="OperationalTopology">
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:all>
<xs:element name="Element1" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="Element1_In" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="ID" use="optional"/>
<xs:attribute name="dt" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
上面的 xsd 在验证 XML 时出错。
错误发生在 dt:dt 属性中。
xs:attribute
元素的 name
属性的值只能是本地名称 (dt
)。它应该在它自己的模式中声明(比如,xsd2.xsd
),因为它有一个不同的命名空间(当然除非这个模式已经存在于某个地方):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:schemas-microsoft-com:datatypes">
<xs:attribute name="dt"/>
</xs:schema>
然后原始模式可以导入上述模式,将命名空间绑定到 dt
前缀,并使用对 dt:dt
的属性引用而不是声明它:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:import namespace="urn:schemas-microsoft-com:datatypes" schemaLocation="xsd2.xsd"/>
<xs:element name="OperationalTopology">
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:all>
<xs:element name="Element1" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="Element1_In" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="ID" use="optional"/>
<xs:attribute ref="dt:dt" use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
XSD 文件无法验证包含 dt:dt
属性的 XML 文件。 XSD 文件不接受 dt:dt
属性。
例如
<xs:attribute name="dt:dt" type="xs:nonNegativeInteger" use="optional"/>
在上面 xs:attribute 中,不接受 dt:dt
名称。因此 XML 包含属性 dt:dt="10"
的文件无法验证。
是否有修改 XSD 以使 dt:dt
属性得到验证的解决方案?
XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<OperationalTopology xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xsi:noNamespaceSchemaLocation="xsd.xsd">
<Element1>
<Element1_In ID="xx" dt:dt="string"/>
</Element1>
</OperationalTopology>
XSD 文件:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="OperationalTopology">
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:all>
<xs:element name="Element1" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="Element1_In" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="ID" use="optional"/>
<xs:attribute name="dt" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
上面的 xsd 在验证 XML 时出错。 错误发生在 dt:dt 属性中。
xs:attribute
元素的 name
属性的值只能是本地名称 (dt
)。它应该在它自己的模式中声明(比如,xsd2.xsd
),因为它有一个不同的命名空间(当然除非这个模式已经存在于某个地方):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:schemas-microsoft-com:datatypes">
<xs:attribute name="dt"/>
</xs:schema>
然后原始模式可以导入上述模式,将命名空间绑定到 dt
前缀,并使用对 dt:dt
的属性引用而不是声明它:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:import namespace="urn:schemas-microsoft-com:datatypes" schemaLocation="xsd2.xsd"/>
<xs:element name="OperationalTopology">
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:all>
<xs:element name="Element1" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="Element1_In" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="ID" use="optional"/>
<xs:attribute ref="dt:dt" use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>