Errore: la destinazione dell'istruzione di elaborazione corrispondente a “[xX] [mM] [lL]” non è consentita


181

Questo errore,

La destinazione dell'istruzione di elaborazione corrispondente a "[xX] [mM] [lL]" non è consentita

si verifica ogni volta che eseguo una pagina XSLT che inizia come segue:

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

Nota : ho rimosso tutti gli spazi iniziali prima della prima riga, ma l'errore si verifica ancora!


1
Questo errore non è particolare per XSLT; si riferisce all'analisi XML in generale. Controlla non solo il tuo file XSLT principale, ma anche tutti i file XSLT inclusi / importati ( ../header.xsl) e il documento di input XML che viene trasformato, per ciascuna delle tre possibilità che elencherò nella mia risposta di seguito .
kjhughes,

Risposte:


365

Gli strumenti basati su Xerces emetteranno il seguente errore

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

quando una dichiarazione XML viene rilevata in un luogo diverso da quello nella parte superiore di un file XML.

Questo è un messaggio diagnostico valido; altri parser XML dovrebbero emettere un messaggio di errore simile in questa situazione.

Per correggere il problema, verificare le seguenti possibilità:

  1. Prima della dichiarazione esiste uno spazio vuoto o altro contenuto visibile<?xml ?> .

    Soluzione : rimuovere uno spazio vuoto o qualsiasi altro contenuto visibile prima della dichiarazione XML.

  2. Alcuni contenuti invisibili esistono prima della <?xml ?> dichiarazione. Più comunemente si tratta di un Byte Order Mark (BOM) .

    Risoluzione : rimuovere la DBA usando tecniche come quelle suggerite dalla pagina W3C sulla DBA in HTML.

  3. Un randagio <?xml ?>dichiarazione esiste all'interno del contenuto XML. Ciò può accadere quando i file XML vengono combinati in modo programmatico o tramite taglia e incolla. Può esistere una sola <?xml ?>dichiarazione in un file XML e può essere solo all'inizio.

    Soluzione : cercare senza <?xmldistinzione tra maiuscole e minuscole e rimuovere dal file tutte le dichiarazioni XML tranne quelle principali.


Per un <? Xml randagio, come faresti effettivamente a scorrere il file xml per trovarlo? Come se usassi qualcosa come sax o parser di stax funzionasse bene (ho provato a farlo con stax ma non lo riconosce)
user2062207

Per eliminare una dichiarazione XML vagante, devi trattare il file come testo, non XML, perché una dichiarazione XML aggiuntiva impedisce che l'XML sia ben formato . Utilizzare un editor di testo o aprire il file a livello di codice e operare su di esso come testo per eliminare la <?xml ?>dichiarazione vagante prima di trattarlo come un file XML.
kjhughes,

4
Hai le mie simpatie perché problemi intermittenti sono notoriamente difficili da eseguire il debug. Tuttavia, non posso fare altro da qui se non dirti che questo errore è decisamente deterministico : sarà sempre un errore che una dichiarazione XML appaia più di una volta o in qualsiasi luogo diverso dalla parte superiore di un file XML. In bocca al lupo.
kjhughes,

1
Se il tuo messaggio XML è archiviato come stringa, puoi provare a fare un trim () sulla stringa prima di passarlo al tuo parser SAX. Per qualche motivo stavo ottenendo risposte XML che introdussero uno spazio bianco aggiuntivo all'inizio, il che causava l'errore Xerces sopra quando analizzato.
Robert Casey,

1
È un vecchio thread, ma questo potrebbe aiutare qualcuno: dopo aver copiato manualmente un file xml dal browser e averlo incollato in un file di testo locale e salvato come xml, abbiamo ottenuto lo stesso errore (il file in questione era un pom.xml e l'errore è stato ricevuto mentre facevo un build sul gradle). Abbiamo scoperto che c'era una riga vuota nella parte superiore del file xml, anche prima del tag <? Xml>, lo ha rimosso e ha funzionato!
JavaTec

13

Il motivo per me è 2 del seguente codice in un XML

<?xml version="1.0" encoding="utf-8"?>

2
Rimuovo gli spazi davanti alle versioni <? Xml ... e questo ha funzionato per me.
xpagesbeast

1
Questa risposta era già stata fornita : # 3: Risoluzione : cercare <?xmlin modo insensibile alle maiuscole e minuscole e rimuovere dal file tutte le dichiarazioni XML tranne quelle principali.
kjhughes,

Può confermare, qualcuno ha incasinato la copia e incolla.
fl0w

3

C'è stato un messaggio di Copyright generato automaticamente XMLe una riga vuota prima del <resources>tag, una volta rimossa la mia build ha avuto successo.

inserisci qui la descrizione dell'immagine


1
La rimozione di commenti o spazi bianchi prima della dichiarazione XML potrebbe eliminare questo errore, ma per il documento mostrato nell'immagine, non è necessario rimuovere il commento o la riga vuota dopo la dichiarazione XML.
kjhughes,

1

Un altro motivo dell'errore sopra è il file jar danneggiato. Ho avuto lo stesso errore ma per Junit durante l'esecuzione dei test unitari. Rimuovere il vaso e scaricarlo di nuovo risolve il problema.


0

nel mio caso era un percorso errato in un file di configurazione: il file non è stato trovato (percorso errato) ed è uscito con questa eccezione:

Errore durante la configurazione dal flusso di input. La causa iniziale era La destinazione dell'istruzione di elaborazione corrispondente "[xX] [mM] [lL]" non è consentita.


0

Ho avuto un problema simile con 50.000 file rdf / xml in 5.000 directory (il file di catalogo di Project Gutenberg). L'ho risolto con la rivolta (nella distribuzione di Jena)

la directory è cache / epub / NN / nn.rdf (dove NN è un numero)

nella directory sopra la directory in cui si trovano tutti i file, ovvero nella cache

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

Questo produce probabilmente molti avvisi ma il risultato è in un formato che può essere caricato in jena (usando l'interfaccia web di fuseki).

sorprendentemente semplice (almeno in questo caso).


0

Per PHP, inserisci questa riga di codice prima di iniziare a stampare il tuo XML:

while(ob_get_level()) ob_end_clean();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.