Erreur: la cible de l'instruction de traitement correspondant à «[xX] [mM] [lL]» n'est pas autorisée

181

Cette erreur,

La cible de l'instruction de traitement correspondant à "[xX] [mM] [lL]" n'est pas autorisée

se produit chaque fois que j'exécute une page XSLT qui commence comme suit:

<?xml version="1.0" encoding="windows-1256"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:include href="../header.xsl"/>
  <xsl:template match="/">
    <xsl:call-template name="pstyle"/>
    <xsl:call-template name="Validation"/>
    <xsl:variable name="strLang">
      <xsl:value-of select="//lang"/>
    </xsl:variable>
    <!-- ////////////// Page Title ///////////// -->
    <title>
        <xsl:value-of select="//ListStudentFinishedExam.Title"/>
    </title>

Remarque : j'ai supprimé tous les espaces de début avant la première ligne, mais l'erreur se produit toujours!

Lecteur Java
la source
1
Cette erreur n'est pas particulière à XSLT; il concerne l'analyse XML en général. Vérifiez non seulement votre fichier XSLT principal, mais également tous les fichiers XSLT inclus / importés ( ../header.xsl) ainsi que le document d'entrée XML en cours de transformation, pour chacune des trois possibilités que j'énumère dans ma réponse ci-dessous .
kjhughes du

Réponses:

365

Les outils basés sur Xerces émettront l'erreur suivante

The processing instruction target matching "[xX][mM][lL]" is not allowed.

lorsqu'une déclaration XML est rencontrée ailleurs qu'en haut d'un fichier XML.

Ceci est un message de diagnostic valide; les autres analyseurs XML doivent émettre un message d'erreur similaire dans cette situation.

Pour corriger le problème, vérifiez les possibilités suivantes:

  1. Un espace vide ou un autre contenu visible existe avant la <?xml ?> déclaration.

    Résolution : supprimez l'espace vide ou tout autre contenu visible avant la déclaration XML.

  2. Un contenu invisible existe avant la <?xml ?> déclaration. Il s'agit le plus souvent d'une marque d'ordre d'octet (BOM) .

    Solution : supprimez la nomenclature en utilisant des techniques telles que celles suggérées par la page W3C sur la nomenclature en HTML.

  3. Une déclaration parasite <?xml ?>existe dans le contenu XML. Cela peut se produire lorsque des fichiers XML sont combinés par programme ou par copier-coller. Il ne peut y avoir qu'une seule <?xml ?>déclaration dans un fichier XML, et elle ne peut être qu'en haut.

    Résolution : effectuez une recherche <?xmlsans tenir compte de la casse et supprimez toutes les déclarations XML du fichier à l'exception de la première déclaration.

kjhughes
la source
Pour un <? Xml errant, comment procéderiez-vous pour parcourir le fichier xml pour le trouver? Comme si l'utilisation de quelque chose comme des analyseurs sax ou stax fonctionnerait bien (j'ai essayé de le faire avec stax mais il ne le reconnaît pas)
user2062207
Pour éliminer une déclaration XML parasite, vous devez traiter le fichier comme du texte et non comme du XML, car une déclaration XML supplémentaire empêche le XML d'être correctement formé . Utilisez un éditeur de texte ou ouvrez le fichier par programme et utilisez-le en tant que texte pour éliminer la <?xml ?>déclaration parasite avant de le traiter comme un fichier XML.
kjhughes
4
Vous avez mes sympathies car les problèmes intermittents sont notoirement difficiles à déboguer. Cependant, je ne peux pas aider davantage à partir de là que de vous dire que cette erreur est définitivement déterministe : ce sera toujours une erreur pour une déclaration XML d'apparaître plus d'une fois ou n'importe où autre que le haut d'un fichier XML. Bonne chance.
kjhughes du
1
Si votre message XML est stocké sous forme de chaîne, vous pouvez essayer de faire un trim () sur la chaîne avant de la transmettre à votre analyseur SAX. Pour une raison quelconque, je recevais des réponses XML qui introduisaient un espace blanc supplémentaire au début, ce qui entraînait l'erreur Xerces ci-dessus lors de l'analyse.
Robert Casey
1
C'est un ancien fil, mais cela pourrait aider quelqu'un: après avoir copié manuellement un fichier xml à partir du navigateur et copié-collé dans un fichier texte local et enregistré au format xml, nous avons eu la même erreur (le fichier en question était un pom.xml et l'erreur a été reçu lors d'un build sur gradle). Nous avons découvert qu'il y avait une ligne vide en haut du fichier xml, même avant la balise <? Xml>, nous l'avons supprimée et cela a fonctionné!
JavaTec
13

La raison pour moi est 2 du code suivant dans un xml

<?xml version="1.0" encoding="utf-8"?>
Anuj Jindal
la source
2
Je supprime les espaces devant les versions <? Xml ... et cela a fonctionné pour moi.
xpagesbeast
1
Cette réponse a déjà été fournie : # 3: Résolution : recherchez <?xmlsans tenir compte de la casse et supprimez tout sauf la déclaration XML supérieure du fichier.
kjhughes
Peut confirmer, quelqu'un a gâché le copier-coller.
fl0w le
3

Il y avait un message de copyright généré automatiquement XMLet une ligne vide avant la <resources>balise, une fois que je l'ai supprimée, ma construction a réussi.

entrez la description de l'image ici

Hitesh Sahu
la source
1
La suppression des commentaires ou des espaces avant la déclaration XML pourrait éliminer cette erreur, mais pour le document affiché dans votre image, il n'est pas nécessaire de supprimer le commentaire ou la ligne vide après la déclaration XML.
kjhughes
1

Une autre raison de l'erreur ci-dessus est le fichier jar corrompu. J'ai eu la même erreur mais pour Junit lors de l'exécution des tests unitaires. Supprimer le fichier jar et le télécharger à nouveau résout le problème.

Peter T.
la source
0

dans mon cas, il y avait un mauvais chemin dans un fichier de configuration: le fichier n'a pas été trouvé (le chemin était faux) et il est sorti avec cette exception:

Erreur lors de la configuration à partir du flux d'entrée. La cause initiale était La cible de l'instruction de traitement correspondant à "[xX] [mM] [lL]" n'est pas autorisée.

pikimota
la source
0

J'ai eu un problème similaire avec 50 000 fichiers rdf / xml dans 5 000 répertoires (le fichier catalogue du projet Gutenberg). Je l'ai résolu avec Riot (dans la distribution Jena)

le répertoire est cache / epub / NN / nn.rdf (où NN est un nombre)

dans le répertoire au-dessus du répertoire où se trouvent tous les fichiers, c'est-à-dire en cache

riot epub/*/*.rdf --output=turtle > allTurtle.ttl

Cela produit peut-être de nombreux avertissements mais le résultat est dans un format qui peut être chargé dans jena (en utilisant l'interface Web de fuseki).

étonnamment simple (du moins dans ce cas).

user855443
la source
0

Pour PHP, mettez cette ligne de code avant de commencer à imprimer votre XML:

while(ob_get_level()) ob_end_clean();
Maison de plage
la source