2015-12-21 646 views
1

这里我XSD:XML验证错误:CVC-elt.1.a:找不到元素的声明 '统计'

<xs:schema xmlns:tns="http://www.w3.org/1999/xhtml" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3.org/1999/xhtml" attributeFormDefault="unqualified" elementFormDefault="qualified"> 
<xs:complexType name="Statistics"> 
    <xs:sequence> 
     <xs:element name="item" minOccurs="0" maxOccurs="unbounded"> 
      <xs:complexType> 
       <xs:sequence> 
        <xs:element name="id" type="xs:string"/> 
        <xs:element name="date" type="xs:string"/> 
        <xs:element name="name" type="xs:string"/> 
        <xs:element name="email" type="xs:string" nillable="true"/> 
        <xs:element name="Advertisers"> 
         <xs:complexType> 
          <xs:sequence> 
           <xs:element name="item" minOccurs="0" maxOccurs="unbounded"> 
            <xs:complexType> 
             <xs:sequence> 
              <xs:element name="id" type="xs:string"/> 
              <xs:element name="ls_revenue_usd_equivalence" type="xs:string"/> 
              <xs:element name="revenue_eur" type="xs:string"/> 
              <xs:element name="revenue_usd" type="xs:string"/> 
              <xs:element name="revenue_rub" type="xs:string"/> 
              <xs:element name="ls_leads" type="xs:string"/> 
              <xs:element name="revenue_usd_equivalence" type="xs:string"/> 
              <xs:element name="leads" type="xs:string"/> 
              <xs:element name="payout_usd" type="xs:string"/> 
              <xs:element name="payout_rub" type="xs:string"/> 
              <xs:element name="payout_eur" type="xs:string"/> 
              <xs:element name="payout_usd_equivalence" type="xs:string"/> 
              <xs:element name="profit" type="xs:string"/> 
             </xs:sequence> 
            </xs:complexType> 
           </xs:element> 
          </xs:sequence> 
         </xs:complexType> 
        </xs:element> 
        <xs:element name="total"> 
         <xs:complexType> 
          <xs:sequence> 
           <xs:element name="leads" type="xs:string"/> 
           <xs:element name="payout_usd" type="xs:string"/> 
           <xs:element name="payout_rub" type="xs:string"/> 
           <xs:element name="payout_eur" type="xs:string"/> 
           <xs:element name="payout_usd_equivalence" type="xs:string"/> 
           <xs:element name="profit" type="xs:string"/> 
          </xs:sequence> 
         </xs:complexType> 
        </xs:element> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

这里是我的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Statistics xmlns="http://www.w3.org/1999/xhtml" attributeFormDefault="unqualified" elementFormDefault="qualified"> 
     <item> 
      <id>1</id> 
      <date>16.12.2015</date> 
      <name>test</name> 
      <email>test</email> 
      <Advertisers> 
       <item> 
        <id>2</id> 
        <ls_revenue_usd_equivalence>0</ls_revenue_usd_equivalence> 
        <revenue_eur>0</revenue_eur> 
        <revenue_usd>0</revenue_usd> 
        <revenue_rub>0</revenue_rub> 
        <ls_leads>0</ls_leads> 
        <revenue_usd_equivalence>0</revenue_usd_equivalence> 
        <leads>0</leads> 
        <payout_usd>0</payout_usd> 
        <payout_rub>0</payout_rub> 
        <payout_eur>0</payout_eur> 
        <payout_usd_equivalence>0</payout_usd_equivalence> 
        <profit>0</profit> 
       </item> 
      </Advertisers> 
      <total> 
       <leads>0</leads> 
       <payout_usd>0</payout_usd> 
       <payout_rub>0</payout_rub> 
       <payout_eur>0</payout_eur> 
       <payout_usd_equivalence>0</payout_usd_equivalence> 
       <profit>0</profit> 
      </total> 
     </item> 
</Statistics> 

当我尝试验证此XML时,出现此错误:

cvc-elt.1.a: Cannot find the declaration of element 'Statistics'.

乍一看,所有权利和命名空间相匹配。我不明白什么可能仍然是一个错误。 我在做什么错?

回答

1

首先,不要再使用一个众所周知的命名空间http://www.w3.org/1999/xhtml,比其预期的目的以外的东西。你只是在寻求混乱,与现有的XML目录冲突等

其次,attributeFormDefaultelementFormDefault在你的XML,但在你的XSD不属于。

第三,马丁Honnen提到,您XSD缺少Statistics的元素声明。

第四,如果你真的不能更改XSD,但要使用它,你可以做以下之一:

下面是如何在你的情况下使用xsi:type(没有应用推荐命名修复):

<?xml version="1.0" encoding="UTF-8"?> 
<Statistics xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.w3.org/1999/xhtml try.xsd" 
      xmlns:tns="http://www.w3.org/1999/xhtml" 
      xsi:type="tns:Statistics"> 
    <item> 
    <id>1</id> 
    <date>16.12.2015</date> 
    <name>test</name> 
    <email>test</email> 
    <Advertisers> 
     <item> 
     <id>2</id> 
     <ls_revenue_usd_equivalence>0</ls_revenue_usd_equivalence> 
     <revenue_eur>0</revenue_eur> 
     <revenue_usd>0</revenue_usd> 
     <revenue_rub>0</revenue_rub> 
     <ls_leads>0</ls_leads> 
     <revenue_usd_equivalence>0</revenue_usd_equivalence> 
     <leads>0</leads> 
     <payout_usd>0</payout_usd> 
     <payout_rub>0</payout_rub> 
     <payout_eur>0</payout_eur> 
     <payout_usd_equivalence>0</payout_usd_equivalence> 
     <profit>0</profit> 
     </item> 
    </Advertisers> 
    <total> 
     <leads>0</leads> 
     <payout_usd>0</payout_usd> 
     <payout_rub>0</payout_rub> 
     <payout_eur>0</payout_eur> 
     <payout_usd_equivalence>0</payout_usd_equivalence> 
     <profit>0</profit> 
    </total> 
    </item> 
</Statistics> 
+1

我会强调一点,即不要滥用你不拥有的名称空间。模式验证器完全有权说:“啊,XHTML命名空间;我已经知道了这一切,我不需要费心阅读这个模式”。 –

1

您已经定义了一个与xs:complexType name="Statistics"复杂类型,但不是该名称的元素。您需要定义<xs:element name="Statistics"><xs:complexType>...</xs:complexType></xs:element>

+0

,如果我不能改变XSD文件 - 然后我需要删除从XML的元素? –

+0

如果模式没有定义全局元素,那么我就不会看到如何编写一个实例文档来对模式有效,否则可能会执行' ...'。但是架构不定义任何全局元素是非常不寻常的。另一方面,你的目标命名空间是W3C的XHTML命名空间,所以我不知道模式试图用这个命名空间来做什么。 –

+0

@MartinHonnen,IIRC FpML的工作原理是这样的:通常的做法是使用xsi:type来验证实例文档中定义的类型,而不是针对全局元素声明。 –

相关问题