我试图读取一个结构未知的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)
有没有办法在Map中保存每个标签的开始和结束字符串?
1条答案
按热度按时间f3temu5u1#
只需保存一堆StringBuilder: