错误:不允许匹配“[xX][mM][lL]”的处理指令目标。

274

这个错误会在我运行一个以以下内容开头的 XSLT 页面时出现:

处理指令目标匹配“[xX][mM][lL]”不被允许

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

注意:我已经删除第一行前面的任何空格,但是错误仍然发生!


4
这个错误不仅仅限于XSLT,它涉及到XML解析的一般性问题。请检查你主要的XSLT文件以及任何被包含/导入的XSLT文件(例如../header.xsl),以及正在被转换的XML输入文档,对于我在下面回答中列出的三种可能性都要进行检查。 - kjhughes
3
根据我的经验,文件开头不小心添加了一个新的空行。删除后就可以正常工作了。所以我同意第一条评论。 - Dinidu Hewage
10个回答

534

Xerces基于的工具将会发出以下错误

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

当在XML文件的顶部以外的任何位置遇到XML声明时,这是一个有效的诊断消息。其他XML解析器在此情况下应发出类似的错误消息。
要纠正问题,请检查以下可能性:
  1. <?xml ?> 声明之前存在一些空格或其他可见内容。

    解决方法:删除XML声明之前的任何空格或可见内容。

  2. <?xml ?> 声明之前存在一些不可见内容。最常见的是字节顺序标记(BOM)。

    解决方法:使用类似于W3C关于HTML中BOM的页面所建议的技术来移除BOM。

  3. XML内容中存在一个杂项的 <?xml ?> 声明。当通过编程或剪切和粘贴方式合并XML文件时,可能会出现这种情况。XML文件中只能有一个 <?xml ?> 声明,并且它只能在顶部。

    解决方法:以不区分大小写的方式搜索 <?xml,并从文件中除了顶部的XML声明外删除所有其他声明。


打开 manifest.xml 文件,按下 ctrl+A 然后按下 ctrl+I。它会自动格式化你的 manifest.xml。 - Faisal Naseer
4
我同情你,因为间歇性问题通常很难调试。但是,我无法在这里提供更多帮助,除了告诉你这个错误肯定是确定性的:对于XML声明出现多次或出现在XML文件顶部以外的任何地方,它将始终是一个错误。祝你好运。 - kjhughes
3
如果您的XML消息以字符串形式存储,传递给SAX解析器之前可以尝试对该字符串执行trim()操作。由于某种原因,我的XML响应在开头引入了额外的空格,这导致在解析时出现了上述Xerces错误。 - Robert Casey
1
这是一个旧的帖子,但这可能会对某些人有所帮助: 在手动从浏览器复制xml文件并将其粘贴到本地文本文件中并保存为xml后,我们收到了相同的错误(所涉及的文件是pom.xml,在gradle构建时收到了错误)。我们发现在xml文件顶部甚至在<?xml>标记之前有一个空行,将其删除后就可以正常工作了! - JavaTec
2
刚刚节省了我很多时间去找原因。 - Shtefan
显示剩余9条评论

22

调试您的XML文件。可能存在多余或缺少标签,或者添加了额外的空格。

为了更好地理解,请通过命令行构建项目。Windows: gradlew build

在我的情况下,AndroidManifest.xml文件在第一行有一个空格。

<Empty Row> // This Creates the issue 
<?xml version="1.0" encoding="utf-8"?>

请注意,“添加额外或更少的标记”不会导致主题错误消息,除非它们位于XML声明之前。最后,您的“Either…”语句是误导性的,因为它排除了错误来源的其他可能性(#2和#3在上面已经详细描述)。 - kjhughes

7

XML 文件中,在 <resources> 标签之前有一个自动生成的版权信息和一行空白。当我将其删除后,我的构建成功了。

在此输入图片描述


3
在 XML 声明之前去除注释或空格可以消除此错误,但对于您图片中显示的文档,无需移除 XML 声明后的注释或空白行。 - kjhughes

6

只需删除此行:<?xml version="1.0" encoding="utf-8"?>,因为这种错误只是由于此行引起的,或者您还可以根据此答案中提到的行检查您的行格式。


1
错误。不要盲目地删除XML声明以尝试消除此错误。请理解导致此错误的三种简单可能性,并按照提供的简单明确的解决方案来纠正实际问题。 - kjhughes

1
我曾经遇到过类似的问题,有50000个rdf/xml文件分布在5000个目录中(即Gutenberg项目的目录文件)。我使用Jena发行版中的riot解决了这个问题。
目录路径为cache/epub/NN/nn.rdf(其中NN是一个数字)。
在所有文件所在的上一级目录中,即cache目录下。
riot epub/*/*.rdf --output=turtle > allTurtle.ttl

这可能会产生许多警告,但结果的格式可以加载到jena中(使用fuseki web界面)。
令人惊讶的简单(至少在这种情况下)。

1

以上错误的另一个原因是损坏的jar文件。在运行单元测试时,我遇到了相同的Junit错误。删除jar文件并重新下载可解决该问题。


0

对于 PHP, 在开始打印 XML 之前,请加入以下代码行:

while(ob_get_level()) ob_end_clean();

0
在我的情况下,是配置文件中的路径错误:找不到文件(路径错误),并且它会出现此异常:

从输入流进行配置时发生错误。最初的原因是不允许匹配“[xX][mM][lL]”的处理指令目标。


0
值得检查服务器文件夹,看看是否有一个流浪的pom.xml悬在那里。
我发现我也遇到了其他人描述的有问题的pom.xml,但是在我不希望它存在的文件夹中。 一个旧的构建一直挂在那里,令人不爽D:

0
在我的情况下,制表符是个麻烦制造者。用空格代替制表符应该可以解决这个问题。

1
请注意,在此上下文中,制表符与空格/空白没有任何区别:在XML声明之前都不允许使用。 - kjhughes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接