【问题标题】:android utf-8 file parsingandroid utf-8 文件解析
【发布时间】:2011-10-25 07:26:31
【问题描述】:

我有一些以UTF-8 编码的.xml 文件。但是每当我尝试在我的平板电脑(idea pad、lenovo、android 3.1)上解析它们时,我都会收到同样的错误:

org.xml.SAXParseException: Unexpected token (position: TEXT @1:2 in 
java.io.StringReader@40bdaef8).

这些是引发异常的行:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource inputSource = new InputSource();
inputSource.setCharacterStream(new StringReader(xmlData));
Document doc = db.parse(inputSource); // This line throws exception

这是我的输入:

public String getFromFile(ASerializer aserializer) {
    String filename = aserializer.toLocalResource();
    String data = new String();
    try {
        InputStream stream = _context.getResources().getAssets().open(filename);
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
        StringBuilder str = new StringBuilder();
        String line = null;
        while((line = reader.readLine()) != null) {
            str.append(line);
        }
            stream.close();
            data = str.toString();
   }

           catch(Exception e) {
       }
       return data;
    }

XML 文件:

<Results>
    <Result title="08/07/2011">
        <Field title="Company one" value="030589674"/>
        <Field title="Company two" value="081357852"/>
        <Field title="Company three" value="093587125"/>
        <Field title="Company four" value="095608977"/>
    </Result>
    <Result title="11/07/2011">
        <Field title="Company one" value="030589674"/>
        <Field title="Company two" value="081357852"/>
    </Result>
</Results>

我不想将它们转换为ANSI,那么有什么方法可以使db.parse() 工作吗?

【问题讨论】:

  • 如果你用它显示示例输入真的很有意义
  • 你是怎么读到xmlData的?我怀疑那里出了点问题。
  • 使用读取数据的方法编辑我的原始答案。
  • 如何加载 xmlData? String 将数据存储为 UTF-16,因此可能是初始化存在问题,或者 XML 已损坏 - 示例会有所帮助。

标签: android parsing exception utf-8 sax


【解决方案1】:

在这一行:

BufferedReader reader = new BufferedReader(new InputStreamReader(stream));

您正在使用平台默认编码从stream 读取数据。这几乎可以肯定不是你想要的。您需要检查 XML 的实际编码,正确的方法是 somewhat complicated

幸运的是,每一个健全的 XML 解析器(包括 Java/Android 解析器)都可以独立完成。要让 XML 解析器做到这一点,只需传入 stream 本身,而不是尝试手动读取它。

InputSource inputSource = new InputSource(stream);

【讨论】:

  • 我现在有文件流。那么,我是否必须创建一个新的 Utf-8 字符串,例如 data = new String(inputSource, "UTF-8"); ?
  • @coder:没有!你不需要String。只需从 stream 创建一个 InputSource 并将其传递给解析器。
  • 我正在向我的解析器添加一个新方法,以 InputSource 作为参数。
  • 1.在解析完成之前不要关闭您的流。 2. 不要创建Reader InputSourcea constructor that takes an InputStream
  • @coder:无论您从何处加载 XML:在解析之前尝试手动将其转换为 String 是一个坏主意。如果您的输入(在某些时候)是 InputStream,那么您应该始终InputStream 传递给解析器。
【解决方案2】:

您很可能使用带有 BOM 标记(字节顺序标记)的 XML 文件。

使用从 BOM 检测编码的 API

或者,预处理文件,使 BOM 不存在。

【讨论】:

  • 我用 Notepad++ 手动创建了文件编码:UTF-8 (Not BOM)
【解决方案3】:

默认情况下,您的 java 字符串采用 UTF-16 编码。如果你不能像@Joachim Sauer 建议的那样使用 InputStream,那么试试这个:

Document doc = db.parse(new ByteArrayInputStream(xmlData.getBytes())); 

【讨论】:

    猜你喜欢
    • 2013-07-14
    • 2017-01-16
    • 2020-01-20
    • 2015-11-18
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    相关资源
    最近更新 更多