2013-08-03 32 views
0

我使用以下方法来解析XML文件 -错误解析XML文件编码UTF-8和UTF-16

package com.kcs.xml; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.Reader; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 
import org.xml.sax.InputSource; 

public class ParseXMLOld { 
    public static void main(String[] args) 
    { 
     final String FILE_PATH="C:\\abc.xml"; 
     File file=new File(FILE_PATH); 
     ParseXMLOld pxo=new ParseXMLOld(); 
     pxo.parseUTFXML(file); 
    } 

    public Document parseUTFXML(File file) 
    { 
     DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder=null; 
     Document doc=null; 
     try { 
      docBuilder = docBuilderFactory.newDocumentBuilder(); 
      InputStream inputStream= new FileInputStream(file); 
      Reader reader = new InputStreamReader(inputStream,"UTF-16"); 
      InputSource is = new InputSource(reader); 
      is.setEncoding("UTF-16"); 
      doc = docBuilder.parse(is); 
      System.out.println("Done"); 
      } 
     catch(Exception e) 
      { 
      e.printStackTrace(); 
      } 
     finally 
      { 
      docBuilderFactory=null; 
      docBuilder=null; 
      } 
    return doc; 
    } 
} 

我有两个文件用编码UTF-8和UTF-16。如果上面代码中的“UTF_ENCODING”的值是UTF-8,那么“UTF-8”编码的文件可以正常工作。但是我的代码无法解析其他文件,编码为“UTF-16”,反之亦然。

我想提一个更有趣的事情,如果我用编码UTF-16手动创建示例XML文件,IE7无法打开它。但是,我试图解析的UTF-16编码文件(我从另一个系统获取)在IE7中打开。但是,如果您编辑此文件的第一行(将编码更改为UTF-8,然后再将其更改为UTF-16),则不会打开。我不知道为什么会发生这种情况。

请帮忙。

我不知道如何分享这些文件。如果需要,请告诉我如何分享这两个文件?

例如,如何解析文件下面?

<?xml version="1.0" encoding="UTF-16"?> 
    <Details> 
    <Content> 
     <id>1234¥£€$¢</id> 
     <Valid_From_Date>2013-01-01</Valid_From_Date> 
     <Valid_To_Date>9999-12-31</Valid_To_Date> 
     <Company>1210</Company> 
     <Description>2nd Life Transaction</Description> 
    </Content> 
    <Totals> 
     <Count>1</Count> 
    </Totals> 
</Details> 

我得到下面的错误 -

[致命错误]:1:1:内容是不是在序言不允许的。 org.xml.sax.SAXParseException; lineNumber:1; columnNumber:1;序言中不能有内容。 at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251) at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java: 300) 在com.kcs.xml.ParseXMLOld.parseUTF8XML(ParseXMLOld.java:34) 在com.kcs.xml.ParseXMLOld.main(ParseXMLOld.java:19)如果文件我的

回答

1

以下作品要么有BOM或在前导中指定的编码:

File fXmlFile = … ; 
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document doc = dBuilder.parse(new FileInputStream(fXmlFile)) 
+0

是的你是对的。但是,如果XML文件包含任何UTF-8字符(例如“¥£€$¢”),则这不起作用。感谢您的回复。 – Kartic

+0

你有一个示例文件吗? –

+0

是的,我有几个文件。我可以在这里分享吗?您可以在任何标签下输入上述字符并尝试解析它。 – Kartic