XML Schema验证错误

时间:2012-05-28 05:32:10

标签: java xml validation xsd

我的xml文件为

 <?xml version="1.0" encoding="ISO-8859-1"?>
 <Info>
 <Pan>123</Pan>
 <Name>qwe</Name>
 <Email>qwe</Email>
 <City>qwe</City>
 <State>qwe</State>
 <AssessmentYear>2012</AssessmentYear>
 <MobileNo>1234</MobileNo>
 <Income-Salary>1234</Income-Salary>
 <Income-Other>1234</Income-Other>
 <TotalAmount>122</TotalAmount>
<Signature> 
<SignedInfo>
 <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
 <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
 <Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><Transform Algorithm="http://www.w3.org/TR/1999/REC-xslt-19991116"><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"/>
<xsl:template match="/">
Pan : <xsl:copy-of select="//Pan"/>

MobileNo : <xsl:copy-of select="//MobileNo"/>

TotalAmount : <xsl:copy-of select="//TotalAmount"/>
</xsl:template>
</xsl:stylesheet></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>FgbIIimTLIbd0Zpvq1zDrZse6aJg5bAE1/Q58cEkEvk=</DigestValue></Reference>
 </SignedInfo>
<SignatureValue>dy4QDco5NhXResncu0tUG5ylujDn9siIQSHjuX5HxH2gs70LpsO3KDWNvDXjpgkIySYfzJ/FdC6C
trkSySWRjhObqI8cbcP5VU/nL8pP21+3CO+gF1k884aeX3felpRy0FBBMTYBknQTunWCHvpHk927
ZHGvm6Hiej7iBKr3e1k=</SignatureValue>
</Signature>
</Info>

此xml文件的我的架构文件如下( c1.xsd

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="C:\\xml\\c2.xsd"/>
<xs:element name="Info">
  <xs:complexType>

  <xs:sequence>
      <xs:element name="Pan" type="xs:string"/>
      <xs:element name="Name" type="xs:string"/>
      <xs:element name="Email" type="xs:string"/>
      <xs:element name="City" type="xs:string"/>
      <xs:element name="State" type="xs:string"/>
      <xs:element name="AssessmentYear" type="xs:gYear"/>
      <xs:element name="MobileNo" type="xs:unsignedLong"/>
      <xs:element name="Income-Salary" type="xs:unsignedLong"/>
      <xs:element name="Income-Other" type="xs:unsignedLong"/>
      <xs:element name="TotalAmount" type="xs:unsignedLong"/>
      <xs:element ref="ds:Signature"/>
 </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

c2.xsd(编者)

 <?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3.org/2000/09/xmldsig#">
<xs:element name="Signature">
     <xs:complexType>
      <xs:sequence>
        <xs:element name="SignedInfo">
         <xs:complexType>
          <xs:sequence>
             <xs:element name="CanonicalizationMethod">
              <xs:complexType>
               <xs:attribute name="Algorithm" type="xs:string" use="required"/>
              </xs:complexType>
             </xs:element>
             <xs:element name="SignatureMethod">
               <xs:complexType>
                 <xs:attribute name="Algorithm" type="xs:string" use="required"/>
               </xs:complexType>
             </xs:element>                
            <xs:element name="Reference">
             <xs:complexType>
               <xs:attribute name="URI" type="xs:string"/>
               <xs:all>
               <xs:element name="Transforms">
                 <xs:complexType>
                   <xs:sequence>
                     <xs:element name="Transform" type="xs:string">
                       <xs:complexType>
                         <xs:attribute name="Algorithm" type="xs:string" use="required"/>
                       </xs:complexType>
                      </xs:element>
                   </xs:sequence>
                 </xs:complexType>
               </xs:element>
               <xs:element name="DigestMethod">
                 <xs:complexType>
                   <xs:attribute name="Algorithm" type="xs:string" use="required"/>
                 </xs:complexType>
               </xs:element>
               <xs:element name="DigestValue" type="xs:hexBinary"/>
               </xs:all>
             </xs:complexType>
            </xs:element>
            </xs:sequence>
         </xs:complexType> 
        </xs:element> 
       <xs:element name="SignatureValue" type="xs:string"/>
      </xs:sequence>
     </xs:complexType>
</xs:element>
</xs:schema>

当我验证我的xml文件时,我得到以下异常

org.xml.sax.SAXParseException; systemId: file:/C://xml//c2.xsd; lineNumber: 22;
columnNumber: 37; s4s-elt-invalid-content.1: The content of '#AnonType_Reference
SignedInfoSignature' is invalid.  Element 'element' is invalid, misplaced, or oc
curs too often.

我无法弄清楚我哪里出错了?任何人都可以告诉我代码中的错误究竟在哪里吗?
编辑1后错误

org.xml.sax.SAXParseException; systemId: file:/C://xml//c2.xsd; lineNumber: 22;
columnNumber: 15; s4s-elt-invalid-content.1: The content of '#AnonType_Reference
SignedInfoSignature' is invalid.  Element 'all' is invalid, misplaced, or occurs
 too often.

3 个答案:

答案 0 :(得分:2)

在c2.xsd,第22行

         <xs:complexType>
           <xs:attribute name="URI" type="xs:string"/>
           <xs:element name="Transforms">

xs:element无法显示为xs:complexType的直接子女。它必须位于xs:allxs:choicexs:sequence内。

答案 1 :(得分:1)

我试用了你的文件并设法让它来验证记事本++做了几件事:

  1. 更改了xsd以使用对导入的签名xsd的引用,而不使用任何c:\ reference。为此,我只是将导入的文件复制到与我从
  2. 导入的xsd相同的位置
  3. 将指定ds的c2.xsd更改为其他属性,即dsig
  4. w3 Signature xsd下载了签名xsd的w3c版本,并在导入中使用了该版本(步骤1)。
  5. 更改输出xml以在指定签名时包含xmlns =“http://www.w3.org/2000/09/xmldsig#”行。
  6. 注意xsd和xml我在下面的notepad ++中成功验证了。

    XSD:

    <?xml version="1.0" encoding="utf-8" ?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" attributeFormDefault="unqualified">
    <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd"/>
    <xs:element name="Info">
      <xs:complexType>
    <xs:sequence>
          <xs:element name="Pan" type="xs:string"/>
          <xs:element name="Name" type="xs:string"/>
          <xs:element name="Email" type="xs:string"/>
          <xs:element name="City" type="xs:string"/>
          <xs:element name="State" type="xs:string"/>
          <xs:element name="AssessmentYear" type="xs:gYear"/>
          <xs:element name="MobileNo" type="xs:unsignedLong"/>
          <xs:element name="Income-Salary" type="xs:unsignedLong"/>
          <xs:element name="Income-Other" type="xs:unsignedLong"/>
          <xs:element name="TotalAmount" type="xs:unsignedLong"/>
          <xs:element ref="dsig:Signature" minOccurs="0" maxOccurs="1" />
    </xs:sequence>
      </xs:complexType>
    </xs:element>
    </xs:schema>
    

    和XML:

    <?xml version="1.0" ?>
     <Info xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
     <Pan>123</Pan>
     <Name>qwe</Name>
     <Email>qwe</Email>
     <City>qwe</City>
     <State>qwe</State>
     <AssessmentYear>2012</AssessmentYear>
     <MobileNo>1234</MobileNo>
     <Income-Salary>1234</Income-Salary>
     <Income-Other>1234</Income-Other>
     <TotalAmount>122</TotalAmount>
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
    <SignedInfo>
     <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
     <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
     <Reference URI="">
     <Transforms>
     <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
     <Transform Algorithm="http://www.w3.org/TR/1999/REC-xslt-19991116">
        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
            <xsl:output method="text"/>
            <xsl:template match="/">
    Pan : <xsl:copy-of select="//Pan"/>
    
    MobileNo : <xsl:copy-of select="//MobileNo"/>
    
    TotalAmount : <xsl:copy-of select="//TotalAmount"/>
            </xsl:template>
        </xsl:stylesheet>
    </Transform>
    </Transforms>
    <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
    <DigestValue>FgbIIimTLIbd0Zpvq1zDrZse6aJg5bAE1/Q58cEkEvk=</DigestValue>
    </Reference>
     </SignedInfo>
    <SignatureValue>dy4QDco5NhXResncu0tUG5ylujDn9siIQSHjuX5HxH2gs70LpsO3KDWNvDXjpgkIySYfzJ/FdC6C
    trkSySWRjhObqI8cbcP5VU/nL8pP21+3CO+gF1k884aeX3felpRy0FBBMTYBknQTunWCHvpHk927
    ZHGvm6Hiej7iBKr3e1k=</SignatureValue>
    </Signature>
    </Info>
    

答案 2 :(得分:0)

您的c2.xsd仍然无效,请查看ComplexType定义:

<complexType
  id=ID
  name=NCName
  abstract=true|false
  mixed=true|false
  block=(#all|list of (extension|restriction))
  final=(#all|list of (extension|restriction))
  any attributes
 >

 (annotation?,(simpleContent|complexContent|((group|all|
 choice|sequence)?,((attribute|attributeGroup)*,anyAttribute?))))

</complexType>
必须在group,all,choice或sequence元素之后定义

属性,因此在<xs:element name="Reference">中更改顺序以便先定义<xs:all>然后<xs:attribute>

      <xs:element name="Reference">
         <xs:complexType>
           <xs:all>
           <xs:element name="Transforms">
             <xs:complexType>
               <xs:sequence>
                 <xs:element name="Transform" type="xs:string">
                   <xs:complexType>
                     <xs:attribute name="Algorithm" type="xs:string" use="required"/>
                   </xs:complexType>
                  </xs:element>
               </xs:sequence>
             </xs:complexType>
           </xs:element>
           <xs:element name="DigestMethod">
             <xs:complexType>
               <xs:attribute name="Algorithm" type="xs:string" use="required"/>
             </xs:complexType>
           </xs:element>
           <xs:element name="DigestValue" type="xs:hexBinary"/>
           </xs:all>
           <xs:attribute name="URI" type="xs:string"/>
         </xs:complexType>
        </xs:element>