2016-05-09 2 views
0

Une des choses que j'ai écrites pour la diffusion des griefs de Festivus cette année est la façon dont Xerces/SAX2 signale les erreurs d'analyse.Xerxes/SAX2 signale un mauvais élément

Prenez ce morceau de XSD:

<xs:sequence> 
    <xs:element ref="element1" /> 
    <xs:element ref="element2" /> 
    <xs:element ref="element3" /> 
    <xs:element ref="element4"  minOccurs="0" /> 
    <xs:element ref="element5" /> 
    <xs:element ref="element6" minOccurs="1" /> 
    <xs:element ref="element7"  minOccurs="0" /> 
    <xs:element ref="element8" minOccurs="0" /> 
    <xs:choice minOccurs="0"> 
     <xs:element ref="choiceElement1" /> 
     <xs:element ref="choiceElement2" /> 
    </xs:choice> 
    <xs:element ref="element9" minOccurs="0" /> 
</xs:sequence> 

et de l'échantillon XML

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<xmldocument xmlns="http://www.somewebsite.com/xsd/xmldocument" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.somewebsite.com/xsd/xmldocument xmldocument.xsd"> 

    <transaction msgId="MESSAGE-ID"> 
    <element1>KS0003</element1> 
    <element2>2016-05-09</element2> 
    <element3>10:20:50</element3> 
    <element5>99433</element5> 
    <element8>jesse</element8> 
    </transaction> 

</xmldocument> 

Je reçois cette erreur:

RAW SAX2 ERROR: Error at file "/tmp/QACXV0Z346", line=10, column=17, XML element=element8, Element 'element8' is not valid for content model: '((element1,element2,element3,element4,element5,element6,element7,element8,(choiceElement1|choiceElement1)),element9)'

Il me semble que le problème ici est pas element8, c'est element6, qui est défini sur requis mais est celui qui manque réellement dans le fichier XML. J'ai un code qui tente d'analyser cette chaîne et de déterminer quel est le vrai problème, mais la chaîne d'erreur ne contient aucune information sur les éléments facultatifs, etc. Je ne configure pas les choses correctement - peut-être . J'ai un problème en général avec SAXException - c'est presque inutile - donc ce dont j'ai besoin est plus d'informations de quelque chose qui me dit quel est le vrai problème. Nous utilisons Xerces 2.6 ou 2.8 parce que nous fonctionnons sur un IBM i et ils ne fournissent pas de mises à jour de ce genre à moins que vous ne mettiez à jour le système d'exploitation.

Répondre

0

Les messages d'erreur Xerces sont plutôt bons.

Vous pourriez arguer que dans ce cas particulier, il serait préférable de dire quelque chose le long des lignes de

Encountered element8 but element6 was expected.

C'est bien pour ce cas simple, mais se rendent compte que dans le cas général, il peut y avoir un expression arbitrairement complexe couvrant ce qui aurait pu être attendu. Soyez prêt à introduire beaucoup de complexité pour expliquer de façon concise ce que tout serait permis à un moment donné où l'analyse va mal. Citer le premier point de contradiction avec l'exigence du modèle de contenu parent violé n'est pas un mauvais diagnostic en général.