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);
}
}
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
Mise à jour de la question avec le code qui déclenche l'erreur dans Xerces. – nrad0