0

我必须解析从网络上获得的内容,它可以包含特殊字符。在这种情况下,内容字符串如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<products>
  <product>
    <id>1</id>
    <price>2.14</price>
    <title>test &#382; test</title>

当上面的内容被传递给方法 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 &#382; test被分成三个数组:“test”、“ &#382;”和“test”,所以 elementValue 不相等 test &#382; test,应该是结果。有谁知道如何解决这个问题?

是否需要重新编码源字符串:

 <?xml version="1.0" encoding="UTF-8"?>
<products>
  <product>
    <id>1</id>
    <price>2.14</price>
    <title>test &#382; test</title>

在传递给 XML 处理程序类之前?

谢谢!

4

3 回答 3

3

正如 J on Skeet 在 answer 中所说characters被多次调用。你应该做的是以下几点:

  • 在 中startTag,创建一个 StringBuffer,并记下(例如在布尔值中)如果您在您正在搜索的正确标签中。
  • in characters,如果你在正确的标签中(如果前面设置的布尔值是真的),把字符放在 StringBuffer 中
  • 在中endTag,如果您离开了正确的标签(参见布尔值,与之前相同),请获取 StringBuffer 的内容,瞧!这是您的完整字符串。之后不要忘记清空 StringBuffer。
于 2010-01-02T13:57:37.830 回答
2

你的意思characters是被调用了三遍?如果是这样,您只需要让您的代码处理它 - 解析器完全可以自由地执行此操作。您不应该假设您将在一次调用中获得所有字符数据。

从文档中DocumentHandler.characters()

SAX 解析器可以在单个块中返回所有连续的字符数据,也可以将其拆分为多个块;但是,任何单个事件中的所有角色都必须来自同一个外部实体,以便定位器提供有用的信息。

于 2010-01-02T13:51:44.957 回答
2

我认为您对此无能为力,这是根据 SAX API 的。具体来说,来自http://java.sun.com/javase/6/docs/api/org/xml/sax/ContentHandler.html#characters(char[],%20int,%20int)

Parser 将调用此方法来报告每个字符数据块。SAX 解析器可以在单个块中返回所有连续的字符数据,也可以将其拆分为多个块;但是,任何单个事件中的所有角色都必须来自同一个外部实体,以便定位器提供有用的信息。

(我的重点)

于 2010-01-02T13:58:56.003 回答