【问题标题】:Filter \n character from inputstream从输入流中过滤 \n 字符
【发布时间】:2011-10-05 10:36:41
【问题描述】:

我尝试使用 sax 解析器从输入流中解析 xml。输入流不断地从套接字获取传入的 xml。 '\n' 用作 xml 数据之间的分隔符。这就是 xml 的样子

<?xml version="1.0" encoding="UTF-8"?>
<response processor="header" callback="comheader">
    <properties>
        <timezone>Asia%2FBeirut</timezone>
        <rawoffset>7200000</rawoffset>
        <to_date>1319256000000</to_date>
        <dstrawoffset>10800000</dstrawoffset>
    </properties>
</response>
\n
<event type="progress" time="1317788744214">
    <param key="callback">todayactions</param>
    <param key="percent">10</param>
    <param key="msg">MAPPING</param>
</event>
<event type="progress" time="1317788744216">
    <param key="callback">todayactions</param>
    <param key="percent">20</param><param key="msg">MAPPING</param>
</event>
\n
<?xml version="1.0" encoding="UTF-8"?>
<response processor="header" callback="comheader">
    <properties>
        <timezone>Asia%2FBeirut</timezone>
        <rawoffset>7200000</rawoffset>
        <to_date>1319256000000</to_date>
        <dstrawoffset>10800000</dstrawoffset>
    </properties>
</response>

这对我们的 iphone 项目非常有效,因为我们将字符提升到 \n 并将其存储在字符串中并使用 dom 解析器。

但是当我尝试为 android 执行此操作时,字符串不是一个选项,因为它给了我们 OutOfMemory 异常。所以我们将输入流直接设置为 SaxParser 它一直工作到 \n 字符,之后它给我们异常

org.apache.harmony.xml.ExpatParser$ParseException:在第 2 行,第 2 列 0:文档元素后的垃圾

所以我尝试过滤输入流以跳过“\n”字符。我创建了一个 FilterStreamReader 但我没有成功,看来我的读取功能没有完成这项工作。这是我的代码。

public class FilterStreamReader extends InputStreamReader {
    public FilterStreamReader(InputStream in, String enc)
            throws UnsupportedEncodingException {
        super(in, enc);
    }

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        int read = super.read(cbuf, off, len);
        Log.e("Reader",Character.toString((char)read));
        if (read == -1) {
            return -1;
        }

        int pos = off - 1;
        for (int readPos = off; readPos < off + read; readPos++) {
            if (read == '\n') {
                pos++;
            } else {                
                continue;
            }
            if (pos < readPos) {
                cbuf[pos] = cbuf[readPos];
            }
        }
        return pos - off + 1;
}

有人可以帮我过滤输入流的\n吗?

编辑 根据格雷厄姆所说的,我能够通过删除所有文档类型并添加我自己的开始和结束标记来解析整个数据。所以我不太确定我的问题不是单独过滤 '\n' 。你怎么能解析像这样不断出现的xml?

【问题讨论】:

  • 检查是否存在 \r 符号,具体取决于准备原始文件的底层操作系统,您可能有 \r\n 而不是单个 \r(对于 Linux)

标签: java android xml inputstream sax


【解决方案1】:

问题不在于\n。就是在第一个&lt;/response&gt;标签之后,它认为文档是完整的。

此数据不是有效的 XML。您应该将所有内容包装在单个顶级节点中。此外,您不能在文档中途有第二个&lt;?xml version="1.0" encoding="UTF-8"?&gt; 声明。

【讨论】:

  • 我也想到了。问题是,xml 会实时不断地出现,直到应用程序关闭。而且我不确定是否可以在 之前添加标签。实际上,我的解析器有时通过将输入流包装在来自 apache 的 closeshieldinputstream 中来工作。但我试图以正确的方式做到这一点。另一件事是我对传入的 xml 真的没有任何控制权。
  • 我继续尝试使用 Swizzle Stream 中的 ReplaceFilterInputStream 过滤流中不需要的文档类型。之后,解析器开始获取所有标签。谢谢。
猜你喜欢
  • 2020-03-07
  • 2021-12-03
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多