Xml 文档末尾的额外内容,引用我的根元素作为问题

Xml 文档末尾的额外内容,引用我的根元素作为问题,xml,xsd,xml-parsing,schema,xsd-validation,Xml,Xsd,Xml Parsing,Schema,Xsd Validation,我是XML新手,最近我接到了两份涉及XML和模式的作业。如果我取出模式,浏览器将显示XML,但是当我添加模式时,我在根元素处得到一个错误,表示文档末尾有额外的内容。我在这里查看了一些答案,其中大多数都有两个根元素,或者在其中一个元素名的名称中有一个空格,但这不是问题所在 我知道这很简单,但我已经找了几个小时了,真的遇到了麻烦 <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.o

我是XML新手,最近我接到了两份涉及XML和模式的作业。如果我取出模式,浏览器将显示XML,但是当我添加模式时,我在根元素处得到一个错误,表示文档末尾有额外的内容。我在这里查看了一些答案,其中大多数都有两个根元素,或者在其中一个元素名的名称中有一个空格,但这不是问题所在

我知道这很简单,但我已经找了几个小时了,真的遇到了麻烦

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<xsd:element name="table">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="id" type="xsd:string"/>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="stars">
                <xsd:simpletype>
                    <xsd:restriction base="xsd:positiveinteger">
                        <xsd:mininclusive value="0"/>
                        <xsd:maxinclusive value="5"/> 
                    </xsd:restriction>
                </xsd:simpletype>
            </xsd:element>
            <xsd:element name="facilities">
                <xsd:simpletype>
                    <xsd:restriction base="xsd:string">
                        <xsd:enumeration value="Internet"/>
                        <xsd:enumeration value="Gym"/>
                        <xsd:enumeration value="Parking"/>
                        <xsd:enumeration value="Restaurant"/>
                        <xsd:enumeration value="Pick-up"/>
                    </xsd:restriction>
                </xsd:simpletype>
            </xsd:element>
            <xsd:element name="address" type="xsd:string"/>
            <xsd:element name="distancefromcenter" type="xsd:integer" minoccurs="0"/>
            <xsd:element name="available" type="xsd:boolean"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>
</xsd:schema>
<table>
    <hotel>
        <id>1</id>
        <name>Les Jardins du Marais</name>
        <stars>3</stars>
        <facilities>Internet</facilities>
        <address>74 rue Amelot, Paris, 75011</address>
        <distancefromcenter>2</distancefromcenter>
        <available>True</available>
    </hotel>

    <hotel> 
        <id>2</id>
        <name>Golden Tulip Little Palace</name>
        <stars>4</stars>
        <facilities>Internet Gym Parking Restaurant</facilities>
        <address>4 rue Salomon De Caus, Paris, 75003</address>
        <distancefromcenter>0.1</distancefromcenter>
        <available>False</available>
    </hotel>

    <hotel> 
        <id>3</id>
        <name>Tilsitt Etoile</name>
        <stars>2</stars>
        <facilities>Restaurant</facilities>
        <address>23 rue Brey, Paris, 75017</address>
        <distancefromcenter>3</distancefromcenter>
        <available>False</available>
    </hotel>

    <hotel> 
        <id>4</id>
        <name>Hotel Saint Charles</name>
        <stars> 3</stars>
        <facilities>Parking</facilities>
        <address>6 rue de I'Esperance, Paris, 75013</address>
        <distancefromcenter>1</distancefromcenter>
        <available>True</available>
    </hotel>
</table>

1.
马来斯花园酒店
3.
互联网
巴黎阿梅洛特街74号,75011
2.
真的
2.
金色郁金香小皇宫
4.
网上健身房停车场餐厅
巴黎大教堂路4号,75003
0.1
假的
3.
提尔西特埃托勒酒店
2.
餐厅
巴黎布雷街23号,75017
3.
假的
4.
圣查尔斯酒店
3.
停车场
巴黎世界大道6号,75013
1.
真的

XSD不能与XML文档位于同一个文件中1。如果按照示例中所示同时呈现这两个元素,则有两个根元素,这在XML中是不允许的

而是使用schemaLocation或noNamespaceSchemaLocation向XML处理器提示XSD的位置(在单独的文件中)



1对于希望根据XSD验证XML的从业者来说,没有什么实际价值的非自然扭曲。但是,从理论上看,XSD与之前的DTD一样,可能驻留在它要管理的同一个XML文档中。

实际上,您通常希望XML实例文档及其模式位于不同的XML文档中;使用验证器提供的命令行选项或调用参数指向模式。如果您的验证器没有提供合适的命令行选项,并且您无法废弃它并获得具有更好设计界面的验证器,那么您可能能够使用kjhughes提到的
xsi:schemaLocation
xsi:noNamespaceSchemaLocation
属性

但是说XSD“schema文档”(XSD规范定义为“XSD:schema元素”)和要验证的XML不能在同一个XML文档中并不完全正确。原则上这是完全可能的

但是如果你想这样做,你需要做一些改变

首先,制作一个格式良好的XML文档。一种简单的方法是将现有材料(一个xsd:schema元素和一个table元素)包装在包装器中:

<wrapper>
  <xsd:schema targetNamespace="http://example.com/ns/BryanM."
              xmlns="http://example.com/ns/BryanM."
              elementFormDefault="qualified"
              id="myschema">
    ...
  </xsd:schema>
  <table xmlns="http://example.com/ns/BryanM.">
    ...
  </table>
</wrapper>
正如您可能看到的,这个xsi:schemaLocation属性实际上表示“嗨,好了,XSD验证器!如果您还没有命名空间
http://example.com/ns/BryanM.
,您可以在URI
#myschema
中找到一个,也就是在本文档中ID为
myschema
的元素中。”这就是xsd:schema元素需要携带ID的原因

第三,您需要告诉验证器要根据模式验证哪个元素,或者(可能更可能)确保它可以验证文档的根元素(第一个示例中的包装器,第二个示例中的表)。很少有带有命令行界面的XSD验证器真正提供了一个选项,用于标识您希望它们验证的XML元素;他们只是默默地假设他们被要求验证整个文档。我认为通过API调用的验证器函数更有可能提供这种功能

如果验证器坚持验证整个XML文档(有些是这样的),那么您需要确保您的模式能够胜任这项工作;如果使用“包装器”元素,最简单的方法是添加如下内容

<xsd:element name="wrapper"/>

到模式。(这取决于验证器如何处理XSD 1.0中某些实现定义的行为,这可能是严格必要的,也可能不是严格必要的。)如果使用第二种方法(将架构嵌入表元素),则需要修改“table”元素,以便允许它包含名为“XSD:schema”的子元素;我在这里不谈细节


不幸的是,虽然所有这些原则上都是可能的,但事实是验证器之间的互操作性很低,这使得模式可以嵌入到输入XML文档中;规范没有给他们任何指导,XSD工作组应该写一份说明推荐做法的建议也失败了,因为工作组对这种说明的效用(甚至是对现有做法进行调查的效用)缺乏共识。因此,虽然我认为像kjhughes那样说模式不能与要验证的输入位于同一个XML文档中是不正确的,但在实践中,这样做几乎总是会更好。

噢,哇,谢谢。我给我的老师看了,他不知怎么的没有意识到-u-,这很有趣,不应该被一个只与之相关的问题所掩盖。考虑在一个标题下添加一个问题和自我回答,比如“一个XSD可以像DTD一样嵌入XML中吗?”
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://example.com/ns/BryanM. #myschema"
<xsd:element name="wrapper"/>