-1

我有我的 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.
4

3 回答 3

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

于 2012-05-28T05:41:23.133 回答
1

我尝试了您的文件并设法让它针对notepad ++进行验证,并做了几件事:

  1. 将 xsd 更改为使用对导入签名 xsd 的引用,而无需任何 c:\reference。为此,我只是将导入的文件复制到与我正在从中导入的 xsd 相同的位置
  2. 将您指定 ds 的 c2.xsd 更改为不同的属性,即 dsig
  3. 从w3 Signature xsd下载 w3c 版本的签名xsd并在导入中使用它(步骤 1)。
  4. 在指定签名时更改了输出 xml 以包含 xmlns="http://www.w3.org/2000/09/xmldsig#" 行。

请注意我在下面的 notepad++ 中成功验证的 xsd 和 xml。

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>
于 2012-05-28T09:15:50.507 回答
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>
于 2014-04-04T12:51:20.760 回答