在架构中使用targetNamespace时,如何引用本地simpletype?

时间:2014-06-11 09:18:12

标签: xml xsd

如何在使用targetNamespace时引用十六进制整数simpletype - 它可以不用 我不知道如何解决这个问题,我发现的所有例子都没有使用targetNamespace属性

使用http://www.freeformatter.com/xml-validator-xsd.html

测试

schema / xml

我的xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://foo.xsd">
<xs:simpleType name="hex-integer">
    <xs:restriction base="xs:string">
        <xs:pattern value="0x[0-9a-fA-F]+"/>
    </xs:restriction>
</xs:simpleType>
<xs:element name="TheElements">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="MyElement">
                <xs:complexType>
                    <xs:attribute type="hex-integer" name="TheValue" use="required"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="MyOtherElement">
                <xs:complexType>
                    <xs:attribute type="hex-integer" name="TheOtherValue" use="required"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>

我的xml

<?xml version="1.0" encoding="utf-8"?>
<TheElements>
  <MyElement TheValue="0x20" />
  <MyOtherElement TheOtherValue="0x30" />
</TheElements>

更新:基于42个答案,我能够解析一些xml文件 但在xml文件中发现了名称空间错误的另一个问题

问题:我有很多简单/中等的komplex xml文件,我无法更改,但仍想模式验证它们

我的环境:C ++,Xerces C ++ 3.1.1

名称空间未使用的示例

<?xml version="1.0" encoding="utf-8"?>
<TheElements xmlns="">
  <MyElement TheValue="0x20" />
  <MyOtherElement TheOtherValue="0x30" />
</TheElements>

<?xml version="1.0" encoding="utf-8"?>
<TheElements xmlns="http://foo.xsd">
  <MyElement TheValue="0x20" />
  <MyOtherElement TheOtherValue="0x30" />
</TheElements>

<?xml version="1.0" encoding="utf-8"?>
<TheElements xmlns="http://foo.xsd">
  <MyElement xmlns="" TheValue="0x20" />
  <MyOtherElement TheOtherValue="0x30" />
</TheElements>

1 个答案:

答案 0 :(得分:3)

您需要像这样编写XSD:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://foo.xsd" xmlns:tns="http://foo.xsd" >
<xs:simpleType name="hex-integer">
    <xs:restriction base="xs:string">
        <xs:pattern value="0x[0-9a-fA-F]+"/>
    </xs:restriction>
</xs:simpleType>
<xs:element name="TheElements">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="MyElement">
                <xs:complexType>
                    <xs:attribute type="tns:hex-integer" name="TheValue" use="required"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="MyOtherElement">
                <xs:complexType>
                    <xs:attribute type="tns:hex-integer" name="TheOtherValue" use="required"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>

您还需要在实例文档中声明命名空间:

<?xml version="1.0" encoding="utf-8"?>
<TheElements xmlns="http://foo.xsd">
  <MyElement TheValue="0x20" />
  <MyOtherElement TheOtherValue="0x30" />
</TheElements>

由于模式具有targetNamespace="http://foo.xsd"声明,因此全局类型定义将属于该命名空间,您必须使用该命名空间引用它们。