SAX Parser:从XML检索HTML标记

我有一个要解析的XML,如下所示

 12941450184d2315fa63d6358242  
Android testing

status updated

标签包含HTML内容,其中包含我需要的数据。 我正在使用SAX Parser。 这就是我在做什么

 private Timeline timeLine; //Object private String tempStr; public void characters(char[] ch, int start, int length) throws SAXException { tempStr = new String(ch, start, length); } public void endElement(String uri, String localName, String qName) throws SAXException { if (localName.equalsIgnoreCase("content")) { if (timeLine != null) { timeLine.setContent(tempStr); } } 

这个逻辑会起作用吗? 如果不是,我应该如何使用SAX Parser从XML中提取嵌入的HTML数据。

你可以在所有html也是xml之后解析html。在stackoverflow中有一个类似于此的链接。你可以尝试这个如何使用SAX PARSER解析android中的html内容

在start元素上 ,如果元素是content,则应初始化临时Str缓冲区。 否则,如果内容已经启动,则捕获当前的start元素及其属性,并将其更新为temp Str缓冲区。

在字符上 ,如果内容已启动,请将字符添加到当前字符串缓冲区。

在end元素上,如果内容已启动,则捕获结束节点并添加到字符串缓冲区。

我的假设:

xml只有一个内容标记。

如果html实际上是xhtml,你可以使用SAX解析它并提取标签的xhtml内容,但不是很容易。

您必须让您的处理程序实际响应将由标记内的所有xhtml标记引发的事件,并构建类似于DOM结构的东西,然后您可以将其序列化为xml格式,或者-the-fly直接写入复制内容的xml字符串缓冲区。

如果你修改你的xml,以便内容标记内的html被包装在CDATA元素中,如在如何使用SAX PARSER解析android中的html内容中的建议,那么离你的代码不太远的东西确实应该有效。

但是你不能像在你做的那样将内容放入characters方法中的String tempStr变量中。 您需要有一个startElement方法,该方法在查看标记时初始化字符串的缓冲区,在characters方法中收集到该缓冲区,并将结果放在endElement中的标记的某处。

我以这种方式找到解决方案:

注意:在这个解决方案中,我想获取标签之间的html内容( ... html content ... )

 DefaultHandler handler = new DefaultHandler() { boolean chap = false; public char[] temp; int chapterStart; int chapterEnd; public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("Start Element :" + qName); if (qName.equalsIgnoreCase("chapter")) { chap = true; } } public void endElement(String uri, String localName, String qName) throws SAXException { if (qName.equalsIgnoreCase("chapter")) { System.out.println(new String(temp, chapterStart, chapterEnd-chapterStart)); } System.out.println("End Element :" + qName); } public void characters(char ch[], int start, int length) throws SAXException { if (chap) { temp = ch; chapterStart = start; chap = false; } chapterEnd = start + length; } }; 

更新:

我的代码有一个bug。 因为DocumentHandler中ch []的长度在不同情况下有所不同!