Vic*_*c V 0 java android special-characters saxparser
我在Android应用程序中使用SAX解析器一次读取一些feed.脚本执行如下.
// Begin FeedLezer
try {
/** Handling XML **/
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
/** Send URL to parse XML Tags **/
URL sourceUrl = new URL(
BronFeeds[i]);
/** Create handler to handle XML Tags ( extends DefaultHandler ) **/
Feed_XMLHandler myXMLHandler = new Feed_XMLHandler();
xr.setContentHandler(myXMLHandler);
xr.parse(new InputSource(sourceUrl.openStream()));
} catch (Exception e) {
System.out.println("XML Pasing Excpetion = " + e);
}
sitesList = Feed_XMLHandler.sitesList;
String titels = sitesList.getMergedTitles();
Run Code Online (Sandbox Code Playgroud)
这里有Feed_XMLHandler.java和Feed_XMLList.java,我基本上都是从网上获取的.
但是,此代码有时会失败.我将展示一些例子.
http://imm.io/media/2I/2IAs.jpg 这里非常好.它甚至可以识别并显示撇号.即使点击文章打开,几乎所有的文字都显示出来,所以这一切都很好.源提要在这里.我无法控制饲料.
http://imm.io/media/2I/2IB1.jpg在这里,它并没有那么顺利.它显示ï,但它在撇号上窒息(在Waarom之后应该是'NORAD').这里
http://imm.io/media/2I/2IBQ.jpg这是最糟糕的一个.正如你所看到的,标题只显示一个撇号,而它应该是一个'blablabla'.此外,文本在行的中间结束,引号中没有任何特殊字符.饲料在这里
在所有情况下,我都无法控制Feed.我认为脚本确实会阻塞特殊字符.如何确保SAX正确获取所有字符串?
如果有人知道答案,你真的帮了我很多:D
提前致谢.
这来自Xerces的FAQ.
为什么SAX解析器会丢失一些字符数据,或者为什么数据会分成几个块?如果您阅读SAX文档,您会发现SAX可能会将连续文本作为多个字符调用提供,原因与解析器效率和输入缓冲有关.程序员有责任适当地处理,例如通过累积文本直到下一个非字符事件.
您的代码很好地适应了许多XML解析教程之一(就像这里的一个)现在,教程很好,但是他们没有提到非常重要的东西......
请注意这部分......
public void characters(char[] ch, int start, int length)
throws SAXException
{
if(in_ThisTag){
myobj.setName(new String(ch,start,length))
}
}
Run Code Online (Sandbox Code Playgroud)
我打赌,此时你正在检查布尔值,以标记你所在的标签,然后设置某种类型的价值class?或类似的东西....
但问题是,SAX解析器(缓冲)将不会一次性获取标签之间的所有字符....如果是<tag> Lorem Ipsum...really long sentence...</tag>这样,你的SAX解析器调用characters函数是块....
所以这里的技巧是继续将值附加到字符串变量,并set在标记结束时将其实际(或提交)到结构中...(即in endElement)
例
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
currentElement = false;
/** set value */
if (localName.equalsIgnoreCase("tag"))
{
sitesList.setName(currentValue);
currentValue = ""; //reset the currentValue
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (in_Tag) {
currentValue += new String(ch, start, length); //keep appending string, don't set it right here....maybe there's more to come.
}
}
Run Code Online (Sandbox Code Playgroud)
此外,如果你使用StringBuilder附加会更好,因为这将更有效....
| 归档时间: |
|
| 查看次数: |
875 次 |
| 最近记录: |