2011-10-05 72 views
1

我试图使用sax解析器从输入流中解析xml。输入流从套接字连续获得传入的xml。 '\ n'用作xml数据之间的分隔符。这是XML会是什么样子从输入流中筛选 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> 
\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> 

这是我们采取的人物高达\ n和存储在一个字符串中,并用于DOM解析器完美工作了我们的iphone项目。

但是,当我试图这样做的android,字符串不是一个选项,因为它给我们OutOfMemory异常。所以我们直接设置的InputStream它的工作原理,直到\ n字符,之后,它为我们提供了异常的SAXParser

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

于是,我就过滤的InputStream跳过“\ 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?

+0

检查还存在\ r符号的,这取决于底层的操作系统上编写原始文件可能发生,你有\ r \ n而不是单\ R(如Linux)的 – barmaley

回答

2

问题不在于\n。这是在第一个</response>标签之后,它认为文档是完整的。

此数据不是有效的XML。您应该将所有内容都包含在单个顶级节点中。此外,您不能在文档中部分声明第二个<?xml version="1.0" encoding="UTF-8"?>声明。

+0

我也想到这一点。事情是这样的,xml不断实时地持续到应用程序关闭。我不知道我是否可以在<?xml version =“1.0”>之前添加标签。实际上,我的解析器有时通过将输入流封装在来自apache的closeshieldinputstream中。但我试图做一个适当的方式。另一件事是我真的没有任何控制传入的XML。 – blessenm

+0

我继续尝试使用Swizzle Stream中的ReplaceFilterInputStream过滤流中不需要的文档类型。之后,解析器开始获取所有标签。谢谢。 – blessenm