Вопрос по java, xml, validation – Ошибка проверки XML-схемы

-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(Edited)

 <?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.

I cannot figure out where am I going wrong? Can anyone tell where exactly is the mistake in my code?
Error after Edit 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   ответа
1

Я опробовал ваш файл и смог проверить его на notepad ++, выполнив несколько действий:

  1. Changed the xsd to use a reference to the imported signature xsd without any c:\reference. To do this I just copied that imported file to the same location as the xsd I was doing the importing from
  2. Changed the c2.xsd where you specify the ds to a different attribute namely dsig
  3. Downloaded the w3c version of the signature xsd from w3 Signature xsd and used that in the import (Step 1).
  4. Changed your output xml to include the xmlns="http://www.w3.org/2000/09/xmldsig#" line when specifying the signature.

Обратите внимание на 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

На c2.xsd, строка 22

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

xs:element не может быть прямым ребенкомxs:complexType, Должно быть внутриxs:all, xs:choice или жеxs:sequence.

Проверьте мой c2.xsd сейчас. Я пробовал & lt; xs: all & gt; но все равно это показывает ошибку. Я вставил новую ошибку в свой вопрос suraj
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>

атрибут должен быть определен после группы, всего, элемента выбора или последовательности, поэтому измените порядок в<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>

Похожие вопросы