Java SAX DefaultHandler使用多个具有相同名称的标记解析获取标记值

时间:2015-07-10 15:41:37

标签: java xml-parsing sax

我有这个输入XML:

<REQUEST>
    <ELEMENT>element inside request</ELEMENT>
    <NUMBER>250</NUMBER>
    <LIST>
          <ELEMENT>element inside list</ELEMENT>
          <LETTER>A</LETTER>
    </LIST>
    <OTHER1>other 1</OTHER1>
</REQUEST>

我在一个类中扩展了DefaultHandler,我用它来获取值。

这是我的班级:

public class MyHandler extends DefaultHandler {
    private String elementName = null;
    private boolean bElement = false;

    private String element = null;

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (bElement){
            elementName = new String(ch, start, length);
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if("ELEMENT".equalsIgnoreCase(qName) && elementName == null){
            element = elementName;
        }
        bElement = false;
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if(qName.equalsIgnoreCase("ELEMENT")){
            bElement = true;
        }
    }

    public String getElement() {
        return this.element;
    }

}

我有这个逻辑来获取元素值(请求是一个HttpServletRequest):

ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int n = 0;
while ((n = request.getInputStream().read(buf)) >= 0) {
    baos.write(buf, 0, n);
}
byte[] content = baos.toByteArray();
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
MyHandler handler = new MyHandler();
saxParser.parse(new ByteArrayInputStream(content), handler);
return handler.getElement();

当我发送上面的XML时,我们得到 REQUEST-&gt; LIST-&gt; ELEMENT 中的值,所以我得到了字符串:

  列表中的

元素

但我希望首先在 ELEMENT 标记

中包含String
  请求中的

元素

我需要完成 MyHandler 类中的代码才能获得 REQUEST-&gt; ELEMENT 中的 ELEMENT 值,而不会获得其他内容的元素

1 个答案:

答案 0 :(得分:0)

您需要跟踪XML中的完整位置。

注意 - 这是完全未经测试的代码。

characters

另外 - 另外,在调用{{1}}时,您应始终追加