2017-09-01 2 views
2

L'espace de noms xmlns est défini dans "parent" et remplacé dans "enfant". Puisque mon xsi est le même dans "parent" et "enfant" dois-je aussi remplacer l'espace de noms xsi dans "enfant"?Qu'arrive-t-il à un espace de noms appartenant à un espace de noms surchargé?

<parent xmlns="namespace_A" xmlns:xsi="namespace_C" xsi:schemaLocation="namespace_D"> 
     <child xmlns="namespace_B" xsi:schemaLocation="namespace_E"> 
     </child> 
</parent> 

Tous les validateurs en ligne j'ai essayé de vérifier le xml comme accepté mais je reçois une erreur lors du traitement du xml, qui dit xsi n'est pas lié à « enfant ».

Le code particulier où j'ai ce problème est:

<?xml version="1.0" encoding="UTF-8"?> 
<OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"> 
    <responseDate>2017-08-24T12:54:26</responseDate> 
    <request verb="ListRecords" from="2017-08-08" set="J:10.1007:53599" metadataPrefix="CR_UNIXML" resumptionToken="91554975-0bb1-4cf5-86ae-b2222e6fe01f">http://oai.crossref.org/OAIHandler</request> 
    <!-- recipient 96 crlabs2 --> 
    <ListRecords> 
     <record> 
     <header> 
      <!-- citation-id: 92292627; type: JOURNAL_ARTICLE; --> 
      <identifier>info:doi/10.1007/s40278-017-34281-1</identifier> 
      <datestamp>2017-08-11</datestamp> 
      <setSpec>J</setSpec> 
      <setSpec>J:10.1007</setSpec> 
      <setSpec>J:10.1007:53599</setSpec> 
     </header> 
     <!-- [email protected] --> 
     <metadata> 
      <crossref xmlns="http://www.crossref.org/xschema/1.1" xsi:schemaLocation="http://www.crossref.org/xschema/1.1 http://www.crossref.org/schema/unixref1.1.xsd"> 

C'est le document XML donné comme réponse par un service externe. Je veux juste traiter certaines données avec un processeur donné par le même service externe qui accepte les fichiers xslt pour récupérer les données souhaitées mais je reçois l'erreur suivante:

ERROR: 'The prefix "xsi" for attribute "xsi:schemaLocation" associated with an element type "crossref" is not bound.' 
ERROR: 'com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: The prefix "xsi" for attribute "xsi:schemaLocation" associated with an element type "crossref" is not bound.' 

L'erreur se produit dans la XMLNSDocumentScannerImpl de classe, la méthode scanStartElement(). Dans la boucle suivante, l'uri est nul et l'erreur est levée.

// bind attributes (xmlns are already bound bellow) 
      int length = fAttributes.getLength(); 
      // fLength = 0; //initialize structure 
      for (int i = 0; i < length; i++) { 
       fAttributes.getName(i, fAttributeQName); 

       String aprefix = fAttributeQName.prefix != null 
         ? fAttributeQName.prefix : XMLSymbols.EMPTY_STRING; 
       String uri = fNamespaceContext.getURI(aprefix); 
       // REVISIT: try removing the first "if" and see if it is faster. 
       // 
       if (fAttributeQName.uri != null && fAttributeQName.uri == uri) { 
        // checkDuplicates(fAttributeQName, fAttributes); 
        continue; 
       } 
       if (aprefix != XMLSymbols.EMPTY_STRING) { 
        fAttributeQName.uri = uri; 
        if (uri == null) { 
         fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN, 
           "AttributePrefixUnbound", 
           new Object[]{fElementQName.rawname,fAttributeQName.rawname,aprefix}, 
           XMLErrorReporter.SEVERITY_FATAL_ERROR); 
        } 
        fAttributes.setURI(i, uri); 
        // checkDuplicates(fAttributeQName, fAttributes); 
       } 
      } 
+0

Si votre fichier commence vraiment comme ça (vous ne montrez pas comment il se termine après tout) alors oui, donner cette erreur est un problème du côté du processeur. Cependant, je n'arrive pas à faire échouer Xerces avec ce bug. Pouvez-vous montrer quel code Java déclenche cette erreur? – kumesana

+0

Mise à jour de la question avec le code qui déclenche l'erreur dans Xerces. – nrad0

Répondre

3

Rien ne se produit dans les espaces de noms substitués. Ils ne sont plus l'espace de noms conçu par le préfixe correspondant ou par défaut. C'est tout.

Il n'y a aucun effet en "remplaçant" le même préfixe xmlns: avec le même URI d'espace de nommage. Comme vous avez noté que votre xmlns: xsi est toujours le même, comme il se doit, il n'a pas besoin d'être défini ailleurs que dans l'élément racine.

Notez également qu'il n'est pas nécessaire, bien qu'autorisé, de définir xsi: schemaLocation ailleurs que dans l'élément racine. Vous pouvez donner directement la liste complète de tous les schémas pour tous les espaces de noms dans le premier xsi: schemaLocation, vous épargnant ainsi d'en avoir un autre.

All the online validators I tried verify the xml as accepted but I get an error when processing the xml, which says xsi is not bound in "child".

Dans l'exemple que vous avez donné, xsi est lié en effet. Un processeur qui prétend que ce n'est pas le cas, est faux. C'est bogué, donnant des résultats incorrects. Mais peut-être vos vrais documents ne sont pas exactement comme vous avez donné un exemple.

Il est peu probable, mais possible, qu'un préfixe lié à un élément ascendant soit détaché dans un élément descendant. Donc, des exemples nécessaires.

+0

J'ai mis à jour ma question avec le problème particulier qui a provoqué ma question. – nrad0

+0

Aussi, merci pour votre aide. – nrad0