我正在使用解析器解析以下XML:
<Person>
<Name>Test</Name>
<Phone>111-111-2222</OtherPhone>
<Address>lee h&y</Address>
<Person>
Run Code Online (Sandbox Code Playgroud)
sax解析器的characters方法只读取地址数据,直到'lee h',因为它不将'&'视为一个字符.我需要在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;
}
Run Code Online (Sandbox Code Playgroud)
输出是:: lee h
由于存在外部实体,因此在此处调用characters方法三次以报告元素Address的内容.您应该累积对字符的调用内容,直到您收到endElement事件,然后您拥有完整的内容.
您还可以使用带有验证解析器和适当模式(例如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);
}
}
Run Code Online (Sandbox Code Playgroud)