当前位置: 首页 > 知识库问答 >
问题:

XML架构-验证根目录没有匹配的全局声明

吴高畅
2023-03-14

我试图为以下XML文档创建一个XML模式。https://www.nationalbanken.dk/_vti_bin/DN/DataService.svc/CurrencyRatesHistoryXML?lang=en

然后,我在记事本上安装了XML工具插件,并尝试重新验证模式中的XML文档。

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ecb.int/vocabulary/2002-08-01/eurofxref" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref" elementFormDefault="qualified">  
    <xs:element name="Envelope">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="subject" type="xs:string"></xs:element>
                <xs:element name="Sender">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="name" type="xs:string"></xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="Cube">
                                 <xs:complexType>
                                       <xs:sequence>
                                             <xs:element name="Cube" maxOccurs="unbounded">
                                                   <xs:complexType>
                                                         <xs:sequence>
                                                               <xs:element name="Cube" maxOccurs="unbounded">
                                                                     <xs:complexType>
                                                                           <xs:attribute name="currency" type="xs:string"></xs:attribute>
                                                                           <xs:attribute name="rate" type="xs:double"></xs:attribute>
                                                                           <xs:attribute name="name" type="xs:string"></xs:attribute>
                                                                     </xs:complexType>
                                                               </xs:element>
                                                         </xs:sequence>
                                                         <xs:attribute name="time" type="xs:date"></xs:attribute>
                                                   </xs:complexType>
                                             </xs:element>
                                       </xs:sequence>
                                 </xs:complexType>
                           </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

要验证的XML

<gesmes:Envelope 
    xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"
    xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01"
    gesmes:schemaLocation="http://www.ecb.int/vocabulary/2002-08-01/eurofxref ..\StockDownloadResources\CurrenciesDownloadMANUAL.XSD">
<gesmes:subject>Exhange rates</gesmes:subject>
<gesmes:Sender>
<gesmes:name>Danmarks Nationalbank</gesmes:name>
</gesmes:Sender>
<Cube>
<Cube time="2019-07-25">
<Cube currency="AUD" rate="468.22" name="Australian dollars"/>
<Cube currency="BGN" rate="381.68" name="Bulgarian lev"/>
<Cube currency="BRL" rate="178.71" name="Brazilian real"/>
<Cube currency="CAD" rate="511.60" name="Canadian dollars"/>
<Cube currency="CHF" rate="679.30" name="Swiss francs"/>
<Cube currency="CNY" rate="97.72" name="Chinese yuan renminbi"/>
<Cube currency="CZK" rate="29.25" name="Czech koruny"/>
<Cube currency="EUR" rate="746.48" name="Euro"/>
<Cube currency="GBP" rate="839.09" name="Pounds sterling"/>
<Cube currency="HKD" rate="85.95" name="Hong Kong dollars"/>
<Cube currency="HRK" rate="101.10" name="Croatian kuna"/>
<Cube currency="HUF" rate="2.295" name="Hungarian forints"/>
<Cube currency="IDR" rate="0.0480" name="Indonesian rupiah"/>
<Cube currency="ILS" rate="190.49" name="Israeli shekel"/>
<Cube currency="INR" rate="9.74" name="Indian rupee"/>
<Cube currency="ISK" rate="5.493" name="Icelandic kronur *"/>
<Cube currency="JPY" rate="6.2129" name="Japanese yen"/>
<Cube currency="KRW" rate="0.5689" name="South Korean won"/>
<Cube currency="MXN" rate="35.35" name="Mexican peso"/>
<Cube currency="MYR" rate="163.23" name="Malaysian ringgit"/>
<Cube currency="NOK" rate="77.71" name="Norwegian kroner"/>
<Cube currency="NZD" rate="449.80" name="New Zealand dollars"/>
<Cube currency="PHP" rate="13.14" name="Philippine peso"/>
<Cube currency="PLN" rate="175.76" name="Polish zlotys"/>
<Cube currency="RON" rate="158.06" name="Romanian leu"/>
<Cube currency="RUB" rate="10.65" name="Russian rouble"/>
<Cube currency="SEK" rate="71.13" name="Swedish kronor"/>
<Cube currency="SGD" rate="491.78" name="Singapore dollars"/>
<Cube currency="THB" rate="21.76" name="Thai baht"/>
<Cube currency="TRY" rate="118.47" name="Turkish lira"/>
<Cube currency="USD" rate="671.60" name="US dollars"/>
<Cube currency="XDR" rate="925.37" name="SDR (Calculated **)"/>
<Cube currency="ZAR" rate="48.26" name="South African rand"/>
</Cube>
<!-- MORE CUBES HAS BEEN DELETED --> 
</Cube>
</gesmes:Envelope>

但当我尝试验证模式时,我收到以下验证错误:

使用XML架构验证当前文件:错误:元素'{http://www.gesmes.org/xml/2002-08-01}信封”:没有可用于验证根的匹配全局声明。

在谷歌搜索此验证错误和提交此问题时,您将发现一系列有相同类型错误的人。但是,我遇到的所有人都没有足够的指导我解决这个问题。

我错过了什么?

共有2个答案

裴实
2023-03-14

注释字段不允许足够的信件提供彻底的更新。

首先感谢stevedlawrence,他已经给了我们一些见解:)

cube.xsd

<xs:schema
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"
  elementFormDefault="qualified">  

  <xs:element name="Cube">
    <!-- The rest of your Cube element definition -->
     <xs:complexType>
           <xs:sequence>
                 <xs:element name="Cube" maxOccurs="unbounded">
                       <xs:complexType>
                             <xs:sequence>
                                   <xs:element name="Cube" maxOccurs="unbounded">
                                         <xs:complexType>
                                               <xs:attribute name="currency" type="xs:string"></xs:attribute>
                                               <xs:attribute name="rate" type="xs:double"></xs:attribute>
                                               <xs:attribute name="name" type="xs:string"></xs:attribute>
                                         </xs:complexType>
                                   </xs:element>
                             </xs:sequence>
                             <xs:attribute name="time" type="xs:date"></xs:attribute>
                       </xs:complexType>
                 </xs:element>
           </xs:sequence>
     </xs:complexType>
  </xs:element>

</xs:schema>

信封xsd

<xs:schema
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:cube="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"
  targetNamespace="http://www.gesmes.org/xml/2002-08-01"
  elementFormDefault="qualified">  

  <xs:import schemaLocation="cube.xsd" namespace="http://www.ecb.int/vocabulary/2002-08-01/eurofxref" />

  <xs:element name="Envelope">
    <xs:complexType>
            <xs:sequence>
                <xs:element name="subject" type="xs:string"></xs:element>
                <xs:element name="Sender">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="name" type="xs:string"></xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
        <xs:element ref="cube:Cube" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

XML文件已下载

<gesmes:Envelope 
    xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"
    xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01"
    gesmes:schemaLocation="http://www.ecb.int/vocabulary/2002-08-01/eurofxref ..\StockDownloadResources\envelope.xsd">
<gesmes:subject>Exhange rates</gesmes:subject>
<gesmes:Sender>
<gesmes:name>Danmarks Nationalbank</gesmes:name>
</gesmes:Sender>
<Cube>
<Cube time="2019-07-25">
<Cube currency="AUD" rate="468.22" name="Australian dollars"/>
<Cube currency="BGN" rate="381.68" name="Bulgarian lev"/>
<Cube currency="BRL" rate="178.71" name="Brazilian real"/>
<Cube currency="CAD" rate="511.60" name="Canadian dollars"/>
<Cube currency="CHF" rate="679.30" name="Swiss francs"/>
<Cube currency="CNY" rate="97.72" name="Chinese yuan renminbi"/>
<Cube currency="CZK" rate="29.25" name="Czech koruny"/>
<Cube currency="EUR" rate="746.48" name="Euro"/>
<Cube currency="GBP" rate="839.09" name="Pounds sterling"/>
<Cube currency="HKD" rate="85.95" name="Hong Kong dollars"/>
<Cube currency="HRK" rate="101.10" name="Croatian kuna"/>
<Cube currency="HUF" rate="2.295" name="Hungarian forints"/>
<Cube currency="IDR" rate="0.0480" name="Indonesian rupiah"/>
<Cube currency="ILS" rate="190.49" name="Israeli shekel"/>
<Cube currency="INR" rate="9.74" name="Indian rupee"/>
<Cube currency="ISK" rate="5.493" name="Icelandic kronur *"/>
<Cube currency="JPY" rate="6.2129" name="Japanese yen"/>
<Cube currency="KRW" rate="0.5689" name="South Korean won"/>
<Cube currency="MXN" rate="35.35" name="Mexican peso"/>
<Cube currency="MYR" rate="163.23" name="Malaysian ringgit"/>
<Cube currency="NOK" rate="77.71" name="Norwegian kroner"/>
<Cube currency="NZD" rate="449.80" name="New Zealand dollars"/>
<Cube currency="PHP" rate="13.14" name="Philippine peso"/>
<Cube currency="PLN" rate="175.76" name="Polish zlotys"/>
<Cube currency="RON" rate="158.06" name="Romanian leu"/>
<Cube currency="RUB" rate="10.65" name="Russian rouble"/>
<Cube currency="SEK" rate="71.13" name="Swedish kronor"/>
<Cube currency="SGD" rate="491.78" name="Singapore dollars"/>
<Cube currency="THB" rate="21.76" name="Thai baht"/>
<Cube currency="TRY" rate="118.47" name="Turkish lira"/>
<Cube currency="USD" rate="671.60" name="US dollars"/>
<Cube currency="XDR" rate="925.37" name="SDR (Calculated **)"/>
<Cube currency="ZAR" rate="48.26" name="South African rand"/>
</Cube>
<!-- MORE CUBES HAS BEEN DELETED --> 
</Cube>
</gesmes:Envelope>

当我现在运行模式的记事本验证时,出现以下错误:

使用XML架构验证当前文件:错误:元素'{http://www.gesmes.org/xml/2002-08-01}信封',属性'{http://www.gesmes.org/xml/2002-08-01}schemaLocation':属性'{http://www.gesmes.org/xml/2002-08-01}不允许使用“schemaLocation”。

桑坚
2023-03-14

让我们先看看XML。它定义了以下名称空间和前缀:

  • xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"
  • xmlns: gesmes="http://www.gesmes.org/xml/2002-08-01"

xmlns=表示http://www.ecb.int/vocabulary/2002-08-01/eurofxref名称空间。xmlns:gesmes表示带有gesmes前缀(即信封、主题、发件人、姓名)的XML元素位于http://www.gesmes.org/xml/2002-08-01名称空间。

但是,您的模式将targetNamespace定义为http://www.ecb.int/vocabulary/2002-08-01/eurofxref,这意味着验证希望信封元素位于该命名空间中。但是xml说它应该在另一个名称空间中。这会导致在预期命名空间中找不到预期元素的错误。

首先要意识到的是,模式文件只能定义单个命名空间中的元素,这是由Target etNamespace属性设置的。但是XML混合了具有不同命名空间的元素。因此,我们立即知道我们必须有两个具有不同名称空间的架构文件,其中一个必须导入另一个。所以一个模式是关于信封的,一个模式是关于立方体的。

让我们从Cube模式开始,因为它是内部元素。多维数据集元素位于http://www.ecb.int/vocabulary/2002-08-01/eurofxref命名空间中,因此它应该是该模式的Target etNamespace。然后我们定义Cube元素,像这样:

cube.xsd

<xs:schema
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"
  elementFormDefault="qualified">  

  <xs:element name="Cube">
    <!-- The rest of your Cube element definition -->
  </xs:element>

</xs:schema>

因此,所有多维数据集元素现在都有一个模式,将它们放在正确的名称空间中。

现在我们需要定义信封模式,引用刚才定义的多维数据集元素。信封元素位于http://www.gesmes.org/xml/2002-08-01名称空间,因此这将是我们的targetNamespace。最好定义一个名称空间前缀,这样我们就可以引用多维数据集名称空间。我们需要导入多维数据集模式,以便在该命名空间中引用该多维数据集元素。大概是这样的:

信封xsd

<xs:schema
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:cube="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"
  targetNamespace="http://www.gesmes.org/xml/2002-08-01"
  elementFormDefault="qualified">  

  <xs:import schemaLocation="cube.xsd" namespace="http://www.ecb.int/vocabulary/2002-08-01/eurofxref" />

  <xs:element name="Envelope>
    <xs:complexType>
      <xs:sequence>
        ...
        <xs:element ref="cube:Cube" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

因此,这将包络、主题、发送者和名称元素定义为正确的gesmes命名空间,并引用Cube命名空间中的Cube元素。

 类似资料:
  • 我创建了一个XML文件,但是当我试图对XSD进行验证时,我一直收到以下错误: 错误1845:元素{http://www.stormware.cz/schema/version_2/data.xsd}dataPack:验证根没有匹配的全局声明。 PHP5.4。7 libxml2.7。8. 我的职能: 我的XSD文件:www.stormware。cz/schema/version_2/data。xsd

  • 我正在尝试用xsd文件验证xml文件,以便为加拿大税务局提交T2202税单 下面是我的xml文件,可以稍微修改一下,以便用xsd模式文件进行验证。 请在下面找到我的xsd模式文件,它来自政府网站。 我需要验证xml文件。可以对xml文件进行轻微更改。我得到下面的错误 错误:元素“Return”:验证根目录没有匹配的全局声明

  • 使用名称空间时引用模式时的正确语法是什么? 问题 使用给定的架构创建XML文档。

  • 问题内容: 我正在生成一些XML模式,并希望确保我们的生成器正在创建有效的XML模式文档(不是XML)。我试图提出验证XML Schema文档的代码,但失败了。我不认为会这么复杂。 这段代码与我需要做的非常接近,但是出现以下错误。 我在调用setSchema(uri)时使用URL,以确保XMLSchema.dtd和datatypes.dtd是相对的,希望它们可用,但是我不确定如何进行检查。 我猜想

  • 下面是XSD。 下面是xml文件。 当尝试使用http://www.utilities-online.info/xsdvalidation验证它时,我得到以下错误 第2行62:org.xml.sax.SAXParseException;行号:2;列号:62;CVC-ELT.1:找不到元素“Message”的声明。

  • 我对XML非常陌生,我面临着验证问题,如果我的XML和XSD文件结构良好,我也希望得到一些反馈。 在根据XSD验证XML时,我经常遇到错误- 下面的XML XSD 如果你发现其中任何一个有任何错误,请随时指出。它们都有从图案到最大长度的限制。 谢谢!!!!