2014-12-02 38 views
1

Similar to this question, but unfortunately didn't help致命错误 - 内容是不允许在序言

我想一个字符串解析为XML的Java和不断收到错误:

[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; 
+0

所以你说的XML您发布的作品,对?那么,如果没有看到没有发布的XML,那么你很难分辨出来。但是,您是否使用XML的EBNF语法来检查它是否符合http://www.w3.org/TR/REC-xml/您的字符串是否实际上是格式良好的? – 2014-12-02 09:44:13

+0

对不起,这是*不*工作的XML。我设法得到了一些其他的XML工作,只是简单地包含了基本要素。我已经验证了这个XML,它没有回来任何问题。 – Jon 2014-12-02 09:47:13

+0

根据[W3 Validator](http://validator.w3.org/check),它是有效的XML。也许xfa prolog不被实现接受。 – 2014-12-02 09:53:35

回答

1

文档和示例代码你提供在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); 
    } 

} 
+0

谢谢,这可能会导致此问题。但是,删除这段文本后,它仍然以相同的方式失败。 – Jon 2014-12-02 10:00:48

+0

我用你的代码取代了我的代码,它仍然会抛出错误。 – Jon 2014-12-02 10:06:17

+0

@Jon这很有趣,那么它必须是关于导入或Java版本。 – 2014-12-02 10:07:11

4

我的猜测是,该文件以BOM字符U + FEFF开始:错误在第1行,列1,本是一个零宽度的空间有时用来标记一个文件为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); 
} 
+0

谢谢,我会如何将这添加到我的代码? – Jon 2014-12-02 10:04:40

+0

'xml = xml.replaceFirst(“^ \ uFEFF”,“”);'删除BOM。 _不完全确定这是否是原因。_ – 2014-12-02 10:38:58

相关问题