【问题标题】:XML/XSD TroubleshootingXML/XSD 故障排除
【发布时间】:2016-12-10 14:30:57
【问题描述】:

你好,

过去 2 天我一直在研究 XSD 规范和示例 此 XSD 将验证的 XML 代码。但是,我拥有的 XSD created 不会验证 XML,因此我有来自 关于错误的命令行,我无法确定确切的 原因。

如果有人能帮我解决这个问题,我将不胜感激。

XML 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<peopleCatalogue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="zoznam-osoby.xsd">
<person role="boss" typeOfContact="humanBeing">
    <firstName>Anton</firstName>
    <lastName>Mlaskal</lastName>
    <email typeOfEmail="personal">mlaskalko.antonko@hotmail.com</email>
    <email typeOfEmail="professional">mlaskal.anton@gmail.com</email>
    <phoneNumber typeOfPhone="cell">+421 948 127 337</phoneNumber>
    <phoneNumber typeOfPhone="home">+420 2 48 48 48</phoneNumber>
    <web>www.mlaskal.com</web>
    <adress>
      <streetName>Lubovnikova</streetName>
      <houseNumber>7</houseNumber>
      <postalCode>84107</postalCode>
      <cityName>Bratislava</cityName>
      <country>Slovakia</country>
    </adress>
    <note typeOfNote="action">Please, kill him as soon as possible.</note>
    <note typeOfNote="undercoverInformation">He is the boss of the whole drug cartel we need to eradicate.</note>
</person>

<person role="boss" typeOfContact="IDServicePair">
    <service>Skype</service>
    <ID>Antonius</ID>
</person> </peopleCatalogue>

XSD 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="peopleCatalogue">
    <xsd:complexType>
        <xsd:all>
            <xsd:element name="person">
                <xsd:complexType>    
                    <xsd:attribute name="role" type="xsd:string" default="unknown"/>
                    <xsd:attribute name="typeOfContact">
                        <xsd:simpleType>
                            <xsd:restriction base="xsd:string">
                                <xsd:pattern value="humanBeing|IDServicePair"/>
                            </xsd:restriction>
                        </xsd:simpleType>
                    </xsd:attribute>
                </xsd:complexType>
            </xsd:element>
        </xsd:all>
    </xsd:complexType>    
</xsd:element>

<xsd:complexType name="IDServicePair">
    <xsd:all> 
        <xsd:element name="ID" minOccurs="1" maxOccurs="1">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:pattern value="([a-zA-Z0-9 ])*"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:element>
        <xsd:element name="service" minOccurs="1" maxOccurs="1">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:pattern value="([a-zA-Z0-9 ~!@#$%^*])*"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:element>
    </xsd:all> 
</xsd:complexType>


<xsd:element name="humanBeing">
    <xsd:complexType>
        <xsd:all>
            <xsd:element name="firstName" minOccurs="1" maxOccurs="1">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:pattern value="([a-zA-Z])*"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:element>

            <xsd:element name="lastName" minOccurs="1" maxOccurs="1">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:pattern value="([a-zA-Z])*"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:element>

            <xsd:element name="email">
                <xsd:complexType>
                    <xsd:simpleContent>
                        <xsd:extension base="emailPattern">  
                            <xsd:attribute name="typeOfEmail" default="personal"/>
                        </xsd:extension>
                    </xsd:simpleContent>
                </xsd:complexType>
            </xsd:element>

            <xsd:element name="phoneNumber">
                <xsd:complexType>
                    <xsd:simpleContent>
                        <xsd:extension base="phonePattern">  
                            <xsd:attribute name="typeOfPhone" default="cell"/>
                        </xsd:extension>
                    </xsd:simpleContent>
                </xsd:complexType>
            </xsd:element>

            <xsd:element name="web">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:pattern value="(https?://[a-zA-Z]+(\.[a-zA-Z]+)*\.[a-zA-Z]{2,9})|(www(\.[a-zA-Z]+)+((\.[a-zA-Z]{2,9}){1}))"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:element>

            <xsd:element name="adress">
                <xsd:complexType>
                    <xsd:all>

                        <xsd:element name="streetName">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:pattern value="([a-zA-Z ])*"/>
                                </xsd:restriction>
                            </xsd:simpleType>    
                        </xsd:element>

                        <xsd:element name="houseNumber">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:integer">
                                    <xsd:pattern value="([0-9])*"/>
                                    <xsd:minInclusive value="0"/>
                                    <xsd:maxInclusive value="99999"/>
                                </xsd:restriction>
                            </xsd:simpleType>    
                        </xsd:element>

                        <xsd:element name="postalCode">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:integer">
                                    <xsd:pattern value="([0-9])*"/>
                                    <xsd:minInclusive value="0"/>
                                    <xsd:maxInclusive value="99999"/>
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>

                        <xsd:element name="cityName">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:pattern value="([a-zA-Z ])*"/>
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>

                        <xsd:element name="country">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:pattern value="([a-zA-Z ])*"/>
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>
                    </xsd:all>
                </xsd:complexType>    
            </xsd:element>

            <xsd:element name="note">
                <xsd:complexType>  
                    <xsd:simpleContent>  
                        <xsd:extension base="noteType">  
                            <xsd:attribute name="typeOfNote"/>  
                        </xsd:extension>  
                    </xsd:simpleContent>  
                </xsd:complexType>  
            </xsd:element>    
        </xsd:all>
</xsd:complexType> </xsd:element>

当我尝试使用 xsd 验证 xml 文件时收到的错误消息 通过

xmllint --noout --schema zoznam-osoby.xsd OnePerson.xml in command line is this:

OnePerson.xml:3: element person: Schemas validity error : Element 'person': Character content is not allowed, because the content type
is empty.
OnePerson.xml:3: element person: Schemas validity error : Element 'person': Element content is not allowed, because the content type is
empty.
OnePerson.xml:22: element person: Schemas validity error : Element 'person': This element is not expected.
OnePerson.xml fails to validate

它告诉我,内容类型为空,但我不知道,什么 这是关于什么的内容。怎样做才能让它发挥作用?

【问题讨论】:

  • 您的架构和您的问题表明您对 XML 架构的理解存在相当大的差距。建议你先学习相关的学习资料,比如Definitive XML Schema,或者W3C的XML Schema Primer
  • 能否请您简要说明一下?
  • 好吧,错误信息已经告诉了你需要知道的一切。在 schema 中,person 被声明为一个内容为空的元素,这意味着它不能包含其他元素。
  • 我正在寻找我已将其声明为内容为空的元素的行,但我找不到答案。这就是为什么我要求任何愿意为我指明正确方向的人。
  • 如我所说,你应该学习相关的学习资料。然后你就会知道一个内容为空的元素被简单地声明为by not including any content in its declaration

标签: xml xsd


【解决方案1】:

除了类型定义问题(在下面的示例中修复)之外,您通常会寻找从 XML Schema 标准 (https://www.w3.org/TR/xmlschema11-1/#cTypeAlternative) 版本 1.1 开始定义的条件类型分配,请参阅https://stackoverflow.com/a/27880329

XML Schema v1.1 数据:

<?xml version="1.0" encoding="UTF-8"?>
<peopleCatalogue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:noNamespaceSchemaLocation="zoznam-osoby.xsd">
    <person role="boss" typeOfContact="humanBeing">
        <firstName>Anton</firstName>
        <lastName>Mlaskal</lastName>
        <email typeOfEmail="personal">mlaskalko.antonko@hotmail.com</email>
        <email typeOfEmail="professional">mlaskal.anton@gmail.com</email>
        <phoneNumber typeOfPhone="cell">+421 948 127 337</phoneNumber>
        <phoneNumber typeOfPhone="home">+420 2 48 48 48</phoneNumber>
        <web>www.mlaskal.com</web>
        <adress>
            <streetName>Lubovnikova</streetName>
            <houseNumber>7</houseNumber>
            <postalCode>84107</postalCode>
            <cityName>Bratislava</cityName>
            <country>Slovakia</country>
        </adress>
        <note typeOfNote="action">Please, kill him as soon as possible.</note>
        <note typeOfNote="undercoverInformation">He is the boss of the whole drug cartel we need to eradicate.</note>
    </person>

    <person role="boss" typeOfContact="IDServicePair">
        <service>Skype</service>
        <ID>Antonius</ID>
    </person> 
</peopleCatalogue>

XML Schema v1.1 定义:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
            vc:minVersion="1.1">

    <xsd:element name="peopleCatalogue">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="person" minOccurs="0" maxOccurs="unbounded">
                    <xsd:alternative test="@typeOfContact = humanBeing" type="humanBeing"/>        
                    <xsd:alternative test="@typeOfContact = IDServicePair" type="IDServicePair"/>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:complexType name="IDServicePair">
        <xsd:all>
            <xsd:element name="ID" minOccurs="1" maxOccurs="1">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:pattern value="([a-zA-Z0-9 ])*"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:element>
            <xsd:element name="service" minOccurs="1" maxOccurs="1">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:pattern value="([a-zA-Z0-9 ~!@#$%^*])*"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:element>
        </xsd:all>
        <xsd:attribute name="role" type="xsd:string" default="unknown"/>
        <xsd:attribute name="typeOfContact" type="xsd:string" fixed="IDServicePair"/>
    </xsd:complexType>

    <xsd:complexType name="humanBeing">
        <xsd:sequence>
            <xsd:element name="firstName" minOccurs="1" maxOccurs="1">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:pattern value="([a-zA-Z])*"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:element>

            <xsd:element name="lastName" minOccurs="1" maxOccurs="1">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:pattern value="([a-zA-Z])*"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:element>

            <xsd:element name="email" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:simpleContent>
                        <xsd:extension base="emailPattern">  
                            <xsd:attribute name="typeOfEmail" default="personal"/>
                        </xsd:extension>
                    </xsd:simpleContent>
                </xsd:complexType>
            </xsd:element>

            <xsd:element name="phoneNumber" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:simpleContent>
                        <xsd:extension base="phonePattern">  
                            <xsd:attribute name="typeOfPhone" default="cell"/>
                        </xsd:extension>
                    </xsd:simpleContent>
                </xsd:complexType>
            </xsd:element>

            <xsd:element name="web">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:pattern value="(https?://[a-zA-Z]+(\.[a-zA-Z]+)*\.[a-zA-Z]{2,9})|(www(\.[a-zA-Z]+)+((\.[a-zA-Z]{2,9}){1}))"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:element>

            <xsd:element name="adress">
                <xsd:complexType>
                    <xsd:all>

                        <xsd:element name="streetName">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:pattern value="([a-zA-Z ])*"/>
                                </xsd:restriction>
                            </xsd:simpleType>    
                        </xsd:element>

                        <xsd:element name="houseNumber">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:integer">
                                    <xsd:pattern value="([0-9])*"/>
                                    <xsd:minInclusive value="0"/>
                                    <xsd:maxInclusive value="99999"/>
                                </xsd:restriction>
                            </xsd:simpleType>    
                        </xsd:element>

                        <xsd:element name="postalCode">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:integer">
                                    <xsd:pattern value="([0-9])*"/>
                                    <xsd:minInclusive value="0"/>
                                    <xsd:maxInclusive value="99999"/>
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>

                        <xsd:element name="cityName">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:pattern value="([a-zA-Z ])*"/>
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>

                        <xsd:element name="country">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:pattern value="([a-zA-Z ])*"/>
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>
                    </xsd:all>
                </xsd:complexType>    
            </xsd:element>

            <xsd:element name="note" maxOccurs="unbounded">
                <xsd:complexType>  
                    <xsd:simpleContent>  
                        <xsd:extension base="noteType">  
                            <xsd:attribute name="typeOfNote"/>  
                        </xsd:extension>  
                    </xsd:simpleContent>  
                </xsd:complexType>  
            </xsd:element>    
        </xsd:sequence>
        <xsd:attribute name="role" type="xsd:string" default="unknown"/>
        <xsd:attribute name="typeOfContact" type="xsd:string" fixed="humanBeing"/>

    </xsd:complexType>

    <xsd:simpleType name="emailPattern">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value=".+@.+"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="phonePattern">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="\+[\d\s]+"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="noteType">
        <xsd:restriction base="xsd:string"/>
    </xsd:simpleType>

</xsd:schema>

但是,我不确定对 XML Schema v1.1 的支持有多广泛(至少 NetBeans 8.2 无法理解它)。所以我建议使用 XML Schema v1.0 定义通过元素名称本身而不是通过所需属性的值来区分元素类型。我认为这样做没有多大意义——当必需的属性完全改变其允许的内容时,为什么要使用相同的元素名称?

XML Schema v1.0 数据:

<?xml version="1.0" encoding="UTF-8"?>
<peopleCatalogue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:noNamespaceSchemaLocation="zoznam-osoby.xsd">
    <humanBeing role="boss">
        <firstName>Anton</firstName>
        <lastName>Mlaskal</lastName>
        <email typeOfEmail="personal">mlaskalko.antonko@hotmail.com</email>
        <email typeOfEmail="professional">mlaskal.anton@gmail.com</email>
        <phoneNumber typeOfPhone="cell">+421 948 127 337</phoneNumber>
        <phoneNumber typeOfPhone="home">+420 2 48 48 48</phoneNumber>
        <web>www.mlaskal.com</web>
        <adress>
            <streetName>Lubovnikova</streetName>
            <houseNumber>7</houseNumber>
            <postalCode>84107</postalCode>
            <cityName>Bratislava</cityName>
            <country>Slovakia</country>
        </adress>
        <note typeOfNote="action">Please, kill him as soon as possible.</note>
        <note typeOfNote="undercoverInformation">He is the boss of the whole drug cartel we need to eradicate.</note>
    </humanBeing>

    <IDServicePair role="boss">
        <service>Skype</service>
        <ID>Antonius</ID>
    </IDServicePair> 
</peopleCatalogue>

XML Schema v1.0 定义:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <xsd:element name="peopleCatalogue">
        <xsd:complexType>
            <xsd:choice minOccurs="0" maxOccurs="unbounded">
                <xsd:element name="humanBeing" type="humanBeing"/>
                <xsd:element name="IDServicePair" type="IDServicePair"/>
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>

    <xsd:complexType name="IDServicePair">
        <xsd:all>
            <xsd:element name="ID" minOccurs="1" maxOccurs="1">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:pattern value="([a-zA-Z0-9 ])*"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:element>
            <xsd:element name="service" minOccurs="1" maxOccurs="1">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:pattern value="([a-zA-Z0-9 ~!@#$%^*])*"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:element>
        </xsd:all>
        <xsd:attribute name="role" type="xsd:string" default="unknown"/>
    </xsd:complexType>

    <xsd:complexType name="humanBeing">
        <xsd:sequence>
            <xsd:element name="firstName" minOccurs="1" maxOccurs="1">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:pattern value="([a-zA-Z])*"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:element>

            <xsd:element name="lastName" minOccurs="1" maxOccurs="1">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:pattern value="([a-zA-Z])*"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:element>

            <xsd:element name="email" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:simpleContent>
                        <xsd:extension base="emailPattern">  
                            <xsd:attribute name="typeOfEmail" default="personal"/>
                        </xsd:extension>
                    </xsd:simpleContent>
                </xsd:complexType>
            </xsd:element>

            <xsd:element name="phoneNumber" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:simpleContent>
                        <xsd:extension base="phonePattern">  
                            <xsd:attribute name="typeOfPhone" default="cell"/>
                        </xsd:extension>
                    </xsd:simpleContent>
                </xsd:complexType>
            </xsd:element>

            <xsd:element name="web">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:pattern value="(https?://[a-zA-Z]+(\.[a-zA-Z]+)*\.[a-zA-Z]{2,9})|(www(\.[a-zA-Z]+)+((\.[a-zA-Z]{2,9}){1}))"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:element>

            <xsd:element name="adress">
                <xsd:complexType>
                    <xsd:all>

                        <xsd:element name="streetName">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:pattern value="([a-zA-Z ])*"/>
                                </xsd:restriction>
                            </xsd:simpleType>    
                        </xsd:element>

                        <xsd:element name="houseNumber">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:integer">
                                    <xsd:pattern value="([0-9])*"/>
                                    <xsd:minInclusive value="0"/>
                                    <xsd:maxInclusive value="99999"/>
                                </xsd:restriction>
                            </xsd:simpleType>    
                        </xsd:element>

                        <xsd:element name="postalCode">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:integer">
                                    <xsd:pattern value="([0-9])*"/>
                                    <xsd:minInclusive value="0"/>
                                    <xsd:maxInclusive value="99999"/>
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>

                        <xsd:element name="cityName">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:pattern value="([a-zA-Z ])*"/>
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>

                        <xsd:element name="country">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:pattern value="([a-zA-Z ])*"/>
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>
                    </xsd:all>
                </xsd:complexType>    
            </xsd:element>

            <xsd:element name="note" maxOccurs="unbounded">
                <xsd:complexType>  
                    <xsd:simpleContent>  
                        <xsd:extension base="noteType">  
                            <xsd:attribute name="typeOfNote"/>  
                        </xsd:extension>  
                    </xsd:simpleContent>  
                </xsd:complexType>  
            </xsd:element>    
        </xsd:sequence>
        <xsd:attribute name="role" type="xsd:string" default="unknown"/>
    </xsd:complexType>

    <xsd:simpleType name="emailPattern">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value=".+@.+"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="phonePattern">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="\+[\d\s]+"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="noteType">
        <xsd:restriction base="xsd:string"/>
    </xsd:simpleType>

</xsd:schema>

【讨论】:

    【解决方案2】:

    好的,经过一番努力,我解决了。

    基本上,我尝试做的是在 XML 模式中指定某种 IF 语句。如果一个人有一个 typeOfContact = humanBeing,我希望它有一组元素,如果它是 typeOfContact = IDServicePair,我希望它只有两个元素(ID + 服务)。

    我认为如果我将属性指定为 complexType,这将是可能的。然而,事实并非如此,经过数小时的努力,你最终会遇到与我一样的错误,人们看似在回答,但基本上只是像孩子一样和你说话。

    所以我只是删除了很多我的工作并处理了一个事实,我不能这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-15
      • 2010-11-30
      • 2021-09-11
      • 2012-02-18
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多