当前位置: 首页 > 知识库问答 >
问题:

致命错误: 1:40: prolog中不允许有内容

刁文光
2023-03-14

我有一个用UTF-16 LE编码的超级简单的XML文档。

<?xml version="1.0" encoding="utf-16"?><X id="1" />

我这样加载它(使用jCabi-xml):

BOMInputStream bomIn = new BOMInputStream(Main.class.getResourceAsStream("resources/test.xml"), ByteOrderMark.UTF_16LE);
String firstNonBomCharacter = Character.toString((char)bomIn.read());
Reader reader = new InputStreamReader(bomIn, "UTF-16");
String xmlString = IOUtils.toString(reader);
xmlString = xmlString.trim();
xmlString = firstNonBomCharacter + xmlString;
bomIn.close();
reader.close();
final XML xml = new XMLDocument(xmlString);

我通过保存文件并用十六进制编辑器检查它,检查了没有额外的BOM/垃圾符号(前导或任何地方)。XML格式正确。

但是,我仍然得到以下错误:

[Fatal Error] :1:40: Content is not allowed in prolog.
Exception in thread "main" java.lang.IllegalArgumentException: Invalid XML: "<?xml version="1.0" encoding="utf-16"?><X id="1" />"
    at com.jcabi.xml.DomParser.document(DomParser.java:115)
    at com.jcabi.xml.XMLDocument.<init>(XMLDocument.java:155)
    at Main.getTransformedString(Main.java:47)
    at Main.main(Main.java:26)
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 40; Content is not allowed in prolog.
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
    at com.jcabi.xml.DomParser.document(DomParser.java:105)
    ... 3 more

我上下搜索了这个错误,但他们都说这是BOM的错误,我(据我所知)已经证实不是这样。还有什么不对劲?

共有1个答案

戴博
2023-03-14

以下是我的作品:

    try (InputStream stream = Test.class.getResourceAsStream("/Test.xml")) {
        StreamSource source = new StreamSource(stream);
        final XML xml = new XMLDocument(source);
    }

输入文件的十六进制转储:

FF FE 3C 00 3F 00 78 00 6D 00 6C 00 20 00 76 00 65 00 72 00 73 00 69 00  
6F 00 6E 00 3D 00 27 00 31 00 2E 00 30 00 27 00 20 00 65 00 6E 00 63 00 
6F 00 64 00 69 00 6E 00 67 00 3D 00 27 00 55 00 54 00 46 00 2D 00 31 00 
36 00 27 00 3F 00 3E 00 3C 00 58 00 20 00 69 00 64 00 3D 00 22 00 31 00 
22 00 2F 00 3E 00

据我所知,在您的示例中,您正在将文件的内容转换为字符串。但这是有问题的,因为当您将字节转换为字符串时,实际上会丢弃编码。当SAX解析器将字符串转换为字节数组时,它会决定它将是UTF-8,但prolog声明它是UTF-16,因此您有一个问题。

相反,当我使用StreamSource时,它只会自动检测到文件是从BOM表中以UTF-16 LE编码的事实。

如果您没有使用java-7或更高版本,并且无法使用try with资源,那么请使用流。像以前一样关闭()。

 类似资料:
  • 我正在使用Java,并试图从一些http链接获取XML文档。我使用的代码是: 不要注意,它是一个特殊的类,就像普通的输入流一样。 使用上面的代码,我有时会得到错误

  • 我试图用Java读取一个XML文件,然后将其与XML模式进行比较,但我无法克服此错误: [致命错误]: 1:1: prolog中不允许有内容org.xml.sax.SAXParseExc0019; lineNumber: 1;柱状编号: 1; prolog中不允许有内容。 这是文件读取的开始 我通过十六进制编辑器扫描了我的XML,但是我没有在里面找到任何奇怪的字符,所以我不知道问题出在哪里 我的文

  • 我有一个包含XML(包括主体和元数据)的字符串对象。当我试图解析它时,我得到以下错误: 组织。xml。萨克斯。SAXParseException;行号:1;列数:1;prolog中不允许包含内容 我尝试使用函数,但它没有帮助。我需要一些关于如何编辑我的XML的帮助,以便允许它。

  • 我使用最新的Android Studio 1.3.2(OS Windows 7),在资产目录我把2 apks,当我试图编译我收到这个错误。 如何解决此错误?任何建议都有很大帮助。

  • 我一直在使用Android Studio和Ubuntu13.10没有问题。我决定更新到14.04,现在我无法让Android工作室工作。Gradle无法构建并不断地说错误:Prolog中不允许内容。我所做的只是从头开始创建一个新项目。 > Ubuntu 14.04是从刚擦除的分区安装的 使用Android Studio V5.7,但我也尝试了V4.6 我安装了Oracle JDK,并相应地设置了$

  • 问题内容: 我正在尝试调用Web服务,但是遇到了奇怪的行为。我们的服务器上正在运行一个Web服务,但是该代码未向我们开放,因此无法看到墙后发生了什么。该服务的所有者公开了基于Web的测试客户端UI,该UI在文本框中输入内容,并显示对测试目的的响应。此输入框采用以下提到的格式输入 它在此UI上工作正常,但是当我尝试通过Java代码调用此Web服务时,它也将获得连接以及被该服务授权,但是当我尝试调用上