我必须解析从网络上获得的内容,它可以包含特殊字符。在这种情况下,内容字符串如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<products>
<product>
<id>1</id>
<price>2.14</price>
<title>test ž test</title>
当上面的contet传递给方法characters()时,在从org.xml.sax.helpers.DefaultHandler扩展的类中:
public class ProductsXMLHandler extends DefaultHandler {
...
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String elementValue = new String(ch, start, length);
...
}
我注意到数组test ž test
分为三个数组:'test','ž
'和'test'
所以elementValue不等于test ž test
,它应该是结果。有谁知道如何解决这个问题?
是否有必要重新编码源字符串:
<?xml version="1.0" encoding="UTF-8"?>
<products>
<product>
<id>1</id>
<price>2.14</price>
<title>test ž test</title>
在传递给XML处理程序类之前?
谢谢!
答案 0 :(得分:3)
作为J on Skeet said in in answer,characters
被多次调用。你应该做的是以下几点:
startTag
中,创建一个StringBuffer,并注意(例如,在一个布尔值中),如果你在正在搜索的正确标签中。characters
中,如果你在正确的标签中(如果之前的布尔值设置为真),则将字符放在StringBuffer中endTag
中,如果你没有使用正确的标签(参见boolean,与之前相同),请取出StringBuffer的内容并vo!这是你的完整字符串。在此之后不要忘记清空StringBuffer。答案 1 :(得分:2)
你的意思是characters
被召唤三次?如果是这样,你只需要让你的代码处理 - 解析器完全可以自由地执行此操作。您不应该假设您将在一次通话中获得所有角色数据。
来自DocumentHandler.characters()
的文档:
SAX解析器可能会返回所有连续的 单个块中的字符数据,或 他们可能把它分成几个块; 但是,任何人物中的所有人物 单一事件必须来自同一事件 外部实体,使定位器 提供有用的信息。
答案 2 :(得分:2)
我不认为你可以做任何事情,这是根据SAX API。具体来说,来自http://java.sun.com/javase/6/docs/api/org/xml/sax/ContentHandler.html#characters(char[],%20int,%20int)
Parser会调用此方法 报告每个字符数据块。 SAX解析器可能会返回所有连续的 单个块中的字符数据,或 他们可能将它分成几个 块;但是,所有的 任何单个事件中的字符必须 来自同一个外部实体 Locator提供了有用的功能 信息。
(我的重点)