【问题标题】:Error: The processing instruction target matching "[xX][mM][lL]" is not allowed错误:不允许匹配“[xX][mM][lL]”的处理指令目标
【发布时间】:2013-11-22 05:43:01
【问题描述】:

这个错误,

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

每当我运行如下开头的 XSLT 页面时都会发生:

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

注意:我删除了第一行之前的所有前导空格,但错误仍然存​​在!

【问题讨论】:

  • 这个错误不是 XSLT 特有的;它通常与 XML 解析有关。 不仅要检查您的主 XSLT 文件,还要检查任何包含/导入的 XSLT 文件 (../header.xsl) 以及正在转换的 XML 输入文档,for each of the three possibilities I list in my answer below.
  • 根据我的经验,文件开头意外添加了一个新的空行。删除后它工作正常。所以我同意第一条评论。

标签: java xml xslt


【解决方案1】:

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

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

当遇到XML declaration在 XML 文件顶部以外的任何地方。

这是一条有效的诊断信息;在这种情况下,其他 XML 解析器应该发出类似的错误消息。

要纠正问题,请检查以下可能性:

  1. &lt;?xml ?&gt; 之前存在一些空格或其他 可见 内容 声明。

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

  2. 一些不可见内容存在于&lt;?xml ?&gt;之前 声明。最常见的是Byte Order Mark (BOM)

    分辨率: 使用 W3C page on the BOM in HTML. 建议的技术删除 BOM

  3. 在 XML 内容中存在一个流浪的&lt;?xml ?&gt; 声明。 当 XML 文件以编程方式组合或 通过剪切和粘贴。只能有一个&lt;?xml ?&gt; 声明 在 XML 文件中,并且只能在顶部。

    分辨率:搜索 &lt;?xml 不区分大小写,并删除除顶部 XML 之外的所有内容 文件中的声明。

【讨论】:

  • 对于一个流浪的
  • 要消除杂散的 XML 声明,您必须将文件视为文本,而不是 XML,因为额外的 XML 声明会阻止 XML 成为 well-formed。使用文本编辑器或以编程方式打开文件并将其作为 text 进行操作,以消除杂散的 &lt;?xml ?&gt; 声明 before 将其视为 XML文件。
  • 你有我的同情,因为间歇性问题是出了名的难以调试。但是,除了告诉您此错误绝对确定之外,我无法提供更多帮助:对于 XML,它将总是是一个错误声明多次出现或出现在 XML 文件顶部以外的任何位置。祝你好运。
  • 如果您的 XML 消息存储为字符串,您可以尝试在将字符串传递给 SAX 解析器之前对字符串执行 trim()。出于某种原因,我收到的 XML 响应在开始时引入了额外的空白,导致解析时出现上述 Xerces 错误。
  • 它是一个旧线程,但这可能对某人有所帮助:从浏览器手动复制 xml 文件并将粘贴复制到本地文本文件并保存为 xml 后,我们得到了同样的错误(有问题的文件是一个 pom.xml,在 gradle 上构建时收到错误)。我们发现 xml 文件的顶部有一个空行,甚至在 标记之前,删除它并且它起作用了!
【解决方案2】:

我的原因是 2 个以下代码在一个 xml 中

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

【讨论】:

  • 我删除了
  • 这个答案是already provided: #3: Resolution: 以不区分大小写的方式搜索&lt;?xml,并删除除顶部 XML 声明之外的所有声明从文件中。
  • 可以确认,有人搞砸了复制粘贴。
  • 在那之前我有空间。
  • 一开始我的 xml 定义之前有空间。删除 xslt 开头的所有空格解决了我的问题。
【解决方案3】:

检查您的 XML 文件中是否重复此行

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

【讨论】:

    【解决方案4】:

    XML 中有自动生成的版权消息,&lt;resources&gt; 标记之前有一个空行,一旦我删除它,我的构建就成功了。

    【讨论】:

    • 删除 cmets 或空格 before XML 声明可以消除此错误,但对于图像中显示的文档,无需删除 XML 声明 之后的注释或空行。
    【解决方案5】:

    如果您的 xml 包含以下行,请检查您的 xml 双删除一行(重复行)

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

    删除一个重复的行

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

    【讨论】:

    • 这一点多年来已经多次提出,包括2013年的original answer#3:分辨率:搜索@ 987654324@ 以不区分大小写的方式,并从文件中删除除顶部 XML 声明之外的所有内容。为什么要添加一个毫无新意的新答案?
    • 我的代码中有一个重复的 xml 版本行,因为它为我删除了它的工作......我不知道你为什么像那样抱歉
    • 就我遇到这个问题而言,我只是自己在我的 xml 中检查我发现了这个并删除了对我有用的重复行..这就是我回答的原因,但我不知道你为什么投票喜欢那谢谢你
    • 只有在您有新的或不同的贡献时才应该回答问题。以同样的方式回答已经回答的问题会使网站变得混乱,并且不尊重以前的工作,而不是用赞成票来适当地庆祝它。
    • 我会阅读任何答案,我只是回答我自己的经验,这对我有用
    【解决方案6】:

    调试您的 XML 文件。要么有空间,要么添加额外或更少的标签。

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

    在我的例子中,AndroidManifest.xml 在第一行有一个空格

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

    【讨论】:

    • 请进一步注意,“添加额外或更少标签”不会导致主题错误消息,除非它们位于 XML 声明之前。最后,您的“要么...”声明具有误导性,因为它排除了其他可能的错误来源(#2 和 #3 彻底描述了above)。
    【解决方案7】:

    上述错误的另一个原因是损坏的 jar 文件。我在运行单元测试时遇到了同样的错误,但对于 Junit。删除 jar 并再次下载它解决了这个问题。

    【讨论】:

      【解决方案8】:

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

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

      【讨论】:

        【解决方案9】:

        我在 5,000 个目录(古腾堡项目目录文件)中的 50,000 个 rdf/xml 文件中遇到了类似的问题。我用 riot 解决了它(在耶拿分布中)

        目录是cache/epub/NN/nn.rdf(NN是一个数字)

        在所有文件所在目录之上的目录中,即在缓存中

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

        这可能会产生许多警告,但结果的格式可以加载到 jena 中(使用 fuseki 网络界面)。

        出奇的简单(至少在这种情况下)。

        【讨论】:

          【解决方案10】:

          对于 PHP,在开始打印 XML 之前添加这行代码:

          while(ob_get_level()) ob_end_clean();
          

          【讨论】:

            【解决方案11】:

            在我的例子中,我删除了所有空格而不需要代码。它奏效了

            【讨论】:

              【解决方案12】:

              这个错误确实破坏了XMLEventReader的内存效率,因为当输入的初学者有空格时会失败。

              无论如何,因为已经编码使用它,我必须将 InputStreamReader 源转换为 String 然后调用 trim() 以使用此 String 创建另一个阅读器以创建 XML 事件阅读器。

              伪代码:

              Reader reader = new StringReader(
                      inputStreamToStringBuilder( getInputStream(), getContentCharset() )
                              .toString().trim()
              );
              XMLEventReader eventReader = inputFactory.createXMLEventReader(reader);
              

              【讨论】:

                【解决方案13】:

                值得检查服务器的文件夹,看看是否有一个流浪的 pom.xml。

                我发现我遇到了其他人都用格式错误的 pom.xml 描述的问题,但是在我没想到会在服务器上的文件夹中。一个旧版本在不受欢迎的 D 周围徘徊:

                【讨论】:

                  【解决方案14】:

                  就我而言,标签是麻烦制造者。用空白替换选项卡应该可以解决问题

                  【讨论】:

                  • 请注意,在这种情况下,制表符与空白/空格没有什么不同:在 XML 声明之前都不允许。
                  猜你喜欢
                  • 2013-11-23
                  • 2012-10-22
                  相关资源
                  最近更新 更多