2014-12-02 52 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

相關問題