这个xml的架构应该是什么?

时间:2013-07-05 17:48:32

标签: xml xsd

我正在尝试为以下XML示例编写XSD架构:

<?xml version="1.0" encoding="UTF-8"?>
<locs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="loc.xsd">
    <loc required="true"  comment="A comment">ABC</loc>
</locs>

我试图在架构中强制执行这些规则的规则:

  1. 根元素locs必须包含一个或多个loc
  2. 元素
  3. loc必须有2个属性:requiredboolean&amp; commentstring,长度非零,不完全由空格和/或标点符号组成
  4. loc必须有一个非零长度的字符串值,不完全由空格和/或标点符号组成
  5. 我的loc.xsd如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="locs">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="loc" minOccurs="1" maxOccurs="unbounded">
                        <xs:complexType>
                            <xs:complexContent>
                                <xs:extension base="xs:string">
                                    <xs:attribute name="required" type="xs:boolean" use="required"/>
                                    <xs:attribute name="comment" type="xs:string" use="required"/>
                                </xs:extension>
                            </xs:complexContent>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>
    

    有了这个,我就能够执行规则1&amp; 2但是,第3条规则未被强制执行,因此以下条目有效:

    <loc required="false"  comment="Another comment"/>
    

    我错过了什么?我已经花了几个小时就已经开始了!

3 个答案:

答案 0 :(得分:2)

尝试这个 - 它可以工作

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="nonEmptyString">
        <xs:restriction base="xs:string">
            <xs:minLength value="1" />
            <xs:whiteSpace value="collapse" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="loc_type">
        <xs:simpleContent>
            <xs:extension base="nonEmptyString">
                <xs:attribute name="required" type="xs:boolean" use="required"/>
                <xs:attribute name="comment" type="nonEmptyString" use="required"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:element name="locs">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="loc" type="loc_type" minOccurs="1" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

答案 1 :(得分:1)

你非常接近。

您说第三个约束没有被强制执行,但您显示的示例并未说明非强制执行:元素

<loc required="false"  comment="Another comment"/>

具有零长度字符串作为内容。您告诉XSD验证器,当您说loc的类型是xs:string的扩展名时,这没关系。

你需要采取的方法由JirkaŠ。答案说明。如果您对任何非空字符串感到满意,您可以逐字采用该解决方案。但在此之前,请确保您愿意接受这样的实例:

<loc required="false"  comment="&#x9; ">  </loc>

如果你不是,那么你的要求不是那个注释,loc应该有字符串值,也不是它们应该有非空的字符串值,而是更严格的。当然,理想情况下,您希望它们具有有用的合理的值,但可能无法正式定义有用的注释集或有用的loc值集。 。有些人会说他们想要一个非空字符串,而不是完全由空格和标点符号组成(所以它至少有一个字符与\w类匹配)。

<xs:simpleType name="nonEmptyNonWSString">
  <xs:restriction base="xs:string">
    <xs:minLength value="1" />
    <xs:pattern value="(\W)*\w(\W|\w)*"/>
  </xs:restriction>
</xs:simpleType>

答案 2 :(得分:0)

谢谢你的回答,希望我能接受他们两个!这是我最终采用的(也修改了删除混淆的问题):

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <!-- Must be a string of non-zero length, not composed entirely of whitespace and punctuation marks -->
    <xs:simpleType name="nonEmptyString">
        <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
            <xs:whiteSpace value="collapse"/>
            <xs:pattern value="(\W)*\w(\W|\w)*"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="locs">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="loc" minOccurs="1" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="nonEmptyString">
                                <xs:attribute name="required" type="xs:boolean" use="required"/>
                                <xs:attribute name="comment" type="nonEmptyString" use="required"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>