我正在使用解析器解析以下XML:
<Person>
<Name>Test</Name>
<Phone>111-111-2222</OtherPhone>
<Address>lee h&y</Address>
<Person>
sax解析器的characters方法只读取地址数据直到'lee h',因为它不考虑'&amp;'作为一个角色。我需要在address元素中获取完整的文本。关于我应该如何做的任何想法?这是我的sax解析器(这里的地址是一个标志,表示XML中存在一个地址元素):
boolean address=false;
public void startElement(String uri, String localName,
String qName, Attributes attributes)
throws SAXException {
if (qName.equalsIgnoreCase("Address")) {
address= true;
}
public void characters(char ch[], int start, int length)
throws SAXException {
String data = new String(ch, start, length);
if (address) {
System.out.println("Address is: "+data);
address = false;
}
,输出为:: lee h
答案 0 :(得分:6)
此处调用characters方法三次,以报告元素Address的内容,因为存在外部实体。您应该累积对字符的调用内容,直到您收到endElement事件,然后您就拥有了完整的内容。
请注意documentation of the characters method。
您还可以使用带有验证解析器和适当模式(例如DTD)的ignorableWhitespace方法,让解析器知道哪些空格是可忽略的(由于缩进)。
在Java中,它可能是:
class MyHandler extends DefaultHandler {
private StringBuilder acc;
public MyHandler() {
acc = new StringBuilder();
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.printf("Characters accumulated: %s\n", acc.toString());
acc.setLength(0);
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
acc.append(ch, start, length);
}
}
答案 1 :(得分:0)
答案在某种程度上取决于您使用的解析器。
以下是该问题的详尽说明:http://www.ibm.com/developerworks/xml/library/x-tipsaxdo4/index.html
使用StaX解析器,您可以指定属性isCoalescing = true。此属性specifies whether to coalesce adjacent adjacent character data.
但是对于SAX,通常没有这样的控制。