"Content is not allowed in prolog" 错误,但在XML声明之前没有任何内容。

25 浏览
0 Comments

"Content is not allowed in prolog" 错误,但在XML声明之前没有任何内容。

首先,我已经详尽地检查了以下问题,而这个问题似乎不是同一件事情:

这些问题似乎可以归结为以下两个原因:

  1. 在开头的标签之前有一个或多个(可能是不可见的)字符。
  2. 在正文中有一些字节序列,它们与标签中定义的encoding不匹配。

关于第一个问题,我用xxd检查了我的文件,结果如下所示:

$ xxd sample.fo
00000000: 3c3f 786d 6c20 7665 7273 696f 6e3d 2231  Test mater
00000030: 6961 6c20 6963 6f6e 7354 6869 7320 746f  ial iconsThis to
00000040: 7069 6320 7465 7374 7320 7468 6520 4d61  pic tests the Ma
00000050: 7465 7269 616c 2049 636f 6e73 2e52 4544  terial Icons.RED
00000060: 434f 4d20 4c61 626f 7261 746f 7269 6573  COM Laboratories
00000070: 2c20 496e 632e 0a20 2020 2020 2020 2020  , Inc..
00000080: 2020 2020 2020 2020 2020 2054 6865 7365             这些
00000090: 2061 7265 2074 6865 2074 6573 7473 2066   是测试的材质
000000a0: 6f72 2074 6865 204d 4920 4449 5441 3a0a  图标。.
000000b0: 2020 2020 2020 2020 2020 2020 2020 2020
000000c0: 2020 2020 2020 2020 5465 7374 2074 6865          测试这
000000d0: 2022 6b65 7962 6f61 7264 5f61 7272 6f77   "keyboard_arrow
000000e0: 5f64 6f77 6e22 2069 636f 6e2e 5465 7374  _down" icon.测试
000000f0: 2074 6865 206d 6972 726f 722d 696d 6167   镜像的"reply"图
00000100: 6520 2272 6570 6c79 2220 6963 6f6e 2e54  标。这些图标是在
00000110: 6865 2069 636f 6e73 2061 7265 2072 656e  MaterialIcons字
00000120: 6465 7265 6420 696e 2074 6865 204d 6174  体中渲染的。.
00000130: 6572 6961 6c49 636f 6e73 2066 6f6e 742e  这个FO文件是由Saxon生成的,尝试使用fop-2.2生成PDF:
00000140: 0a09 0954 6573 7420 2331 3a43 6c69 636b  ...测试#1:点击
00000150: 2074 6865 203c 666f 3a69 6e6c 696e 6520   ... icon.点击这
00000240: 6520 3c66 6f3a 696e 6c69 6e65 2078 6d6c  个 
000002a0: 3c66 6f3a 696e 6c69 6e65 2078 6d6c 6e73  .
00000320: 859e 3c2f 666f 3a69 6e6c 696e 653e 3c2f  .. icon.

至于第二个问题,我用file检查了一下:

$ file sample.fo
sample.fo: XML 1.0 document, UTF-8 Unicode text, with very long lines

我只能想到两个Material Icons字体代码点的实例,它们是3字节的UTF-8字符,而且似乎已经正确编码,如这个网站上的在线验证所示:

  1. 图标"keyboard_arrow_down"的代码点是e313,编码为ee 8c 93
  2. 图标"reply"的代码点是e15e,编码为ee 85 9e

正如xxd输出所示,我的XML头似乎是有效的:


我还尝试手动在编码后插入一个空格,如其他问题的答案中建议的那样:


但是没有任何效果。所以我对这个问题感到困惑,特别是给出的错误代码:

[Fatal Error] sample.fo:1:39: Content is not allowed in prolog.
Jul 24, 2018 9:56:34 AM org.apache.fop.cli.Main startFOP
SEVERE: Exception
org.apache.fop.apps.FOPException: org.xml.sax.SAXParseException; systemId: file:/tmp/sample.fo; lineNumber: 1; columnNumber: 39; Content is not allowed in prolog.
javax.xml.transform.TransformerException: org.xml.sax.SAXParseException; systemId: file:/tmp/sample.fo; lineNumber: 1; columnNumber: 39; Content is not allowed in prolog.
        at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:296)
        at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:116)
        at org.apache.fop.cli.Main.startFOP(Main.java:186)
        at org.apache.fop.cli.Main.main(Main.java:217)
Caused by: javax.xml.transform.TransformerException: org.xml.sax.SAXParseException; systemId: file:/tmp/sample.fo; lineNumber: 1; columnNumber: 39; Content is not allowed in prolog.
        at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:502)
        at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:293)
        ... 3 more
Caused by: org.xml.sax.SAXParseException; systemId: file:/tmp/sample.fo; lineNumber: 1; columnNumber: 39; Content is not allowed in prolog.
        at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
        at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:485)
        ... 4 more

为了完整起见,FO文件是由Saxon生成的,而PDF尝试使用fop-2.2生成:

$ fop -version
FOP Version 2.2
$ fop -fo sample.fo -pdf sample.pdf
[Fatal Error] sample.fo:1:39: Content is not allowed in prolog.
...

0
0 Comments

"Content is not allowed in prolog" error yet nothing before XML declaration(XML的前导内容不允许有内容)是由于XML前导(XML prolog)中出现了不允许的文本内容导致的。XML前导是指XML文档中根元素之前的所有内容。该错误不一定发生在XML声明之前。

具体而言,XML中的前导在XML文档的上下文中被定义为:

[1] document ::= prolog element Misc*

注意到前导(prolog)在单一的根元素(element)之前。

大多数答案都集中在前导的开头有文本(可见或不可见)的问题上,但请注意非空白文本也不能出现在前导的任何位置,无论是在内部还是之后:

[22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?

[23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'

[24] VersionInfo ::= S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"')

[25] Eq ::= S? '=' S?

[26] VersionNum ::= '1.' [0-9]+

[27] Misc ::= Comment | PI | S

在您的情况下,XML声明(XMLDecl)和根元素(element)之间出现了“Test material...”文本内容。注释、处理指令或空白可以出现在此处,但不允许有文本。

值得注意的是,尽管该文件不是一个良好形式的文档实体,但它是一个良好形式的外部实体,因此可以使用实体引用将其合并到另一个文档中。这就是为什么XSLT规范允许这样的文件作为转换的输出。

0