xml使用SAX解析器Java正确构建字符串
我正在尝试读取结构未知的XML文件。这可能是一个文件:
<S:Envelope xmlns:S="http://anamespace">envelopeStart
<S:Body>bodyStart
<ns2:getNextResponse xmlns:ns2="http://anothernamespace">getNextResponseStart
<nextValue>9</nextValue>
getNextResponseEnd</ns2:getNextResponse>
bodyEnd</S:Body>
envelopeEnd</S:Envelope>
这是我实际使用的处理程序:
DefaultHandler handler = new DefaultHandler() {
StringBuilder builder;
Map<String, String> values = new HashMap<String, String>();
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
builder = new StringBuilder();
}
@Override
public void characters(char ch[], int start, int length) throws SAXException {
builder.append(new String(ch, start, length));
}
@Override
public void endElement(String uti, String localName, String qName) throws SAXException {
values.put(localName, builder.toString());
builder.setLength(0);
}
}
我面临的问题是,如果我为每一个被解析的新标记实例化一个新的builder
,我将丢失我迄今为止读过的所有开始文本(假设characters
方法在一次调用中返回所有字符):
new Builder for the Envelope tag
reading characters: envelopeStart
new Builder for the Body tag
reading characters: bodyStart
...
new Builder for the nextValue tag <- this is the last reference to the builder that I have to use from now on
reading characters: 9
endElement: saving to Map ('nextValue', '9') and resetting length of the last builder instantiated
reading characters: getNextResponseEnd
endElement: saving to Map ('getNextResponse', 'getNextResponseEnd') and resetting length of the last builder instantiated
...
在这种情况下values
HashMap将具有以下值:
nextValue=9
getNextResponse=getNextResponseEnd (missing getNextResponseStart)
body=bodyEnd (missing bodyStart)
envelope=envelopeEnd (missing envelopeStart)
有没有办法在地图中保存每个标记的开始和结束字符串
# 1 楼答案
只需保留一堆StringBuilder: