【问题标题】:Fatal Error - Content is not allowed in prolog致命错误 - 序言中不允许内容
【发布时间】:2015-01-30 12:00:48
【问题描述】:

Similar to this question, but unfortunately didn't help

我正在尝试在 Java 中将字符串解析为 XML 并不断收到错误:

[Fatal Error] output.txt:1:1: Content is not allowed in prolog.

我知道这一定与我的 XML 字符串有关,因为我使用非常基本的 XML 进行了测试,并且错误消失了。

XML

<?xml version="1.0" encoding="UTF-8"?>
<?xfa generator="ff99v250_01" APIVersion="1.4.3139.0"?>
<jfxpf:XPF xmlns:jfxpf="http://www.xfa.com/schema/xml-package">
   <jfxpf:Package>
      <jfxpf:Resource Location="GenReq">
         <jfxpf:Link ContentType="application/x-jetform-cft" />
      </jfxpf:Resource>
      <jfxpf:Resource Location="default.xml">
         <jfxpf:Content ContentType="text/xml" Location="default.xml">
            <xfa:Data xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">
               <xfa:DataGroup>
                  <data xmlns:xfe="http://www.xfa.org/schema/xfa-events/1.0" xfe:script="$config.proto.common.template.uri='GenReq'" xfe:event="$config:load">
                     <?jetform ^Dat ^page 1?>
                     <FR_NAME>Administrator</FR_NAME>
                     <JFWF_DELEGATE />
                     <ADHOC_DLN_ACTOR />
                     <ADHOC_DLN_MSG />
                         <ADHOC_DLN_TIME />
                     <ADHOC_DLN_UNITS>Days</ADHOC_DLN_UNITS>
                     <ADHOC_RMD_MSG />
                     <ADHOC_RMD_TIME />
                     <ADHOC_RMD_UNITS>Days</ADHOC_RMD_UNITS>
                     <ADHOC_RPT_TIME />
                     <ADHOC_RPT_UNITS>Days</ADHOC_RPT_UNITS>
                     <CIRCULATETO />
                     <COMPLETION />
                     <FOLLOWUP />
                     <MSGSUBJECT />
                     <OTHERFIELD />
                     <PRIORITY>Low</PRIORITY>
                     <REQUEST />
                     <RESPONSE />
                     <Submit />
                     <ADHOC_VALIDDATA>True</ADHOC_VALIDDATA>
                     <JFWF_TRANID>2xxyg9sffane7pwd5j8yv9t49s.1</JFWF_TRANID>
                     <JFWF_INSTRUCTION>Initiate a General Request. Fill the request form, then identify the next participant.</JFWF_INSTRUCTION>
                     <JFWF_TRANSPORT>HTTP</JFWF_TRANSPORT>
                     <JFWF_STATUS>RECEIVED</JFWF_STATUS>
                     <JFWF_ACTION />
                     <JFWF_CHOICE>*Select Next Participant,Cancel</JFWF_CHOICE>
                     <JFWF_VERSION>6.2</JFWF_VERSION>
                     <JFWF_READONLY>1</JFWF_READONLY>
                  </data>
               </xfa:DataGroup>
            </xfa:Data>
         </jfxpf:Content>
      </jfxpf:Resource>
   </jfxpf:Package>
</jfxpf:XPF>

但是,我无法找到导致此问题的文本。我的 Java 代码如下:

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
                    .parse(new InputSource(new StringReader(xml)));

编辑 删除 Data 节点有效,因此错误位于 XML 深处。这不会引发错误:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<?xfa generator=\"ff99v250_01\" APIVersion=\"1.4.3139.0\"?>
<jfxpf:XPF xmlns:jfxpf=\"http://www.xfa.com/schema/xml-package\">
    <jfxpf:Package>
        <jfxpf:Resource Location=\"GenReq\">
            <jfxpf:Link ContentType=\"application/x-jetform-cft\"/>
        </jfxpf:Resource>
        <jfxpf:Resource Location=\"default.xml\">
            <jfxpf:Content ContentType=\"text/xml\" Location=\"default.xml\">
            </jfxpf:Content>
        </jfxpf:Resource>
    </jfxpf:Package>
 </jfxpf:XPF>

我的导入

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.JFileChooser;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

【问题讨论】:

  • 所以您说您发布的 XML 有效,对吗?好吧,如果没有看到您没有发布的不起作用的 XML,这很难说。但是您是否根据w3.org/TR/REC-xml 使用 XML 的 EBNF 语法检查您的字符串是否真的格式正确?
  • 抱歉,这是工作的 XML。我设法让其他一些仅包含基本要素的 XML 工作。我已经验证了这个 XML,它没有返回任何问题。
  • 根据W3 Validator,它是有效的 XML。也许实现不接受 ?xfa 序言。

标签: java xml domdocument


【解决方案1】:

我的猜测是文件以 BOM 字符 U+FEFF 开头:第 1 行第 1 列错误。这是一个零宽度空间,有时用于将文件标记为某种 Unicode 表示形式,UTF-8, UTF-16LE、UTF-16BE。

可以删除 BOM 字符。检查文件大小,然后查看您有哪些选项:另存为不带 BOM 的 UTF-8,删除。

在java中(如果编辑器很顽固):

Path path = Paths.get(".... .xml");
byte[] content = Files.readAllBytes(path);
String s = new String(content, StandardCharsets.UTF_8);
s = s.replaceFirst("^\uFEFF", "");
byte[] content2 = s.getBytes(StandardCharsets.UTF_8);
if (content2.length != content.length) {
    Files.write(path, content2);
}

【讨论】:

  • xml = xml.replaceFirst("^\uFEFF", ""); 删除 BOM。 不完全确定这是否是原因。
【解决方案2】:

您提供的文档和示例代码在 Java 1.8u25 中运行良好:

import static org.junit.Assert.*;

import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.junit.Test;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class FatalErrorTest
{

    @Test
    public void as_given() throws SAXException, IOException, ParserConfigurationException
    {
        String xml ="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<?xfa generator=\"ff99v250_01\" APIVersion=\"1.4.3139.0\"?>\r\n<jfxpf:XPF xmlns:jfxpf=\"http://www.xfa.com/schema/xml-package\">\r\n   <jfxpf:Package>\r\n      <jfxpf:Resource Location=\"GenReq\">\r\n         <jfxpf:Link ContentType=\"application/x-jetform-cft\" />\r\n      </jfxpf:Resource>\r\n      <jfxpf:Resource Location=\"default.xml\">\r\n         <jfxpf:Content ContentType=\"text/xml\" Location=\"default.xml\">\r\n            <xfa:Data xmlns:xfa=\"http://www.xfa.org/schema/xfa-data/1.0/\">\r\n               <xfa:DataGroup>\r\n                  <data xmlns:xfe=\"http://www.xfa.org/schema/xfa-events/1.0\" xfe:script=\"$config.proto.common.template.uri='GenReq'\" xfe:event=\"$config:load\">\r\n                     <?jetform ^Dat ^page 1?>\r\n                     <FR_NAME>Administrator</FR_NAME>\r\n                     <JFWF_DELEGATE />\r\n                     <ADHOC_DLN_ACTOR />\r\n                     <ADHOC_DLN_MSG />\r\n                         <ADHOC_DLN_TIME />\r\n                     <ADHOC_DLN_UNITS>Days</ADHOC_DLN_UNITS>\r\n                     <ADHOC_RMD_MSG />\r\n                     <ADHOC_RMD_TIME />\r\n                     <ADHOC_RMD_UNITS>Days</ADHOC_RMD_UNITS>\r\n                     <ADHOC_RPT_TIME />\r\n                     <ADHOC_RPT_UNITS>Days</ADHOC_RPT_UNITS>\r\n                     <CIRCULATETO />\r\n                     <COMPLETION />\r\n                     <FOLLOWUP />\r\n                     <MSGSUBJECT />\r\n                     <OTHERFIELD />\r\n                     <PRIORITY>Low</PRIORITY>\r\n                     <REQUEST />\r\n                     <RESPONSE />\r\n                     <Submit />\r\n                     <ADHOC_VALIDDATA>True</ADHOC_VALIDDATA>\r\n                     <JFWF_TRANID>2xxyg9sffane7pwd5j8yv9t49s.1</JFWF_TRANID>\r\n                     <JFWF_INSTRUCTION>Initiate a General Request. Fill the request form, then identify the next participant.</JFWF_INSTRUCTION>\r\n                     <JFWF_TRANSPORT>HTTP</JFWF_TRANSPORT>\r\n                     <JFWF_STATUS>RECEIVED</JFWF_STATUS>\r\n                     <JFWF_ACTION />\r\n                     <JFWF_CHOICE>*Select Next Participant,Cancel</JFWF_CHOICE>\r\n                     <JFWF_VERSION>6.2</JFWF_VERSION>\r\n                     <JFWF_READONLY>1</JFWF_READONLY>\r\n                  </data>\r\n               </xfa:DataGroup>\r\n            </xfa:Data>\r\n         </jfxpf:Content>\r\n      </jfxpf:Resource>\r\n   </jfxpf:Package>\r\n</jfxpf:XPF>";
        Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
                .parse(new InputSource(new StringReader(xml)));
        assertNotNull(doc);
    }

}

【讨论】:

  • 谢谢,这可能会导致问题。但是,删除这块文本后,它仍然以同样的方式失败。
  • 我用你的代码替换了我的代码,它仍然抛出错误。
  • @Jon 很有意思,那肯定是关于导入或者Java版本的。
  • 请查看我的导入。
  • @Jon:我还添加了我的导入。我看不出差异。
猜你喜欢
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
相关资源
最近更新 更多