我有一个带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
答案 0 :(得分:3)
<myTag>A & B value</myTag>
(那不是XML。我认为你的意思是A & B value
,形成良好。)
通常,您不能保证每个元素只会调用一次characters()
处理程序。如果元素中没有文本内容,则根本不会调用它;如果有实体引用或文本很长,您很可能会被多次调用。此外,当然任何评论,PI或其他元素肯定需要多次通话。
虽然像&
这样的预定义实体引用导致单独回调内容处理程序是不常见的,但规范中没有任何内容表明它不会因任何(或没有)原因随时发生。 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;