SAXParser问题抓取标签值&字符

时间:2010-07-11 13:40:06

标签: android xmlreader saxparser

我有一个带XMLReader的SAXParser。

SAXParserFactory saxPF = SAXParserFactory.newInstance();
SAXParser sp = saxPF .newSAXParser();
XMLReader xmlR = sp.getXMLReader();
MyHandler myHandler = new MyHandler();
xmlR .setContentHandler(myHandler );

我的处理程序代码使用startElement和endElement来检测它在标记内部。它通过设置布尔值并使用字符()来获取值

来实现
public void startElement(String namespaceURI, 
    String localName, String qName, Attributes atts) throws SAXException {
    if (localName.equals("myTag")) this.in_myTag = true;
}

public void characters(char ch[], int start, int length) {
            if(in_myTag )  { c.setMyTag(new String(ch, start, length));
}

问题是我有一个标签是“A& B Value”,它正在通知字符()为“A”和“&”和“B”和“价值”。所以setMyTag的最终值是“Value”

<myTag>A & B value</myTag>

http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html

2 个答案:

答案 0 :(得分:3)

<myTag>A & B value</myTag>

(那不是XML。我认为你的意思是A &amp; B value,形成良好。)

通常,您不能保证每个元素只会调用一次characters()处理程序。如果元素中没有文本内容,则根本不会调用它;如果有实体引用或文本很长,您很可能会被多次调用。此外,当然任何评论,PI或其他元素肯定需要多次通话。

虽然像&amp;这样的预定义实体引用导致单独回调内容处理程序是不常见的,但规范中没有任何内容表明它不会因任何(或没有)原因随时发生。 In particular:

  

SAX解析器可以在一个块中返回所有连续的字符数据,或者它们可以将它分成几个块

因此,SAX处理程序必须收集发送给它的每一段文本内容,并在endElement发生时将它们连接在一起,而不是从单个characters回调中设置内容。

答案 1 :(得分:0)

看一下Trouble parsing quotes with SAX parser (javax.xml.parsers.SAXParser) on Android API 1.5

顺便说一句&amp;是不正确的XML字符,它应该是&amp; amp;