使用SAX解析混合内容XML

时间:2016-06-14 19:03:48

标签: java xml sax

我有一个混合内容XML文档示例(无法修改结构):

<items>
    <item>  ABC123    <status>UPDATE</status>
    <units>
        <unit Description="Each     ">EA     <saleprice>2.99</saleprice>
            <saleprice2/>
        </unit>
    </units>
    <warehouses>
        <warehouse>100<availability>2987.000</availability>
        </warehouse>
    </warehouses>
    </item>
</items>

我正在尝试在此XML文档上使用SAX解析器,但混合内容元素会导致一些问题。也就是说,在尝试处理<item/>节点时,我得到一个空字符串。

我的经纪人:

@Override
public void startElement(final String uri, 
        final String localName, final String qName, final Attributes attributes) throws SAXException {

    final String fixedQName = qName.toLowerCase();
    switch (fixedQName) {
        case "item":
            prod = new Product();
            //prod.setItem(content); <-- doesn't work, content is empty since element just started
            break;
    }

}

@Override
public void endElement(final String uri, final String localName, final String qName) throws SAXException {
    final String fixedQName = qName.toLowerCase();
    switch (fixedQName) {
        case "item":
            prod.setItem(content); // <-- doesn't work either, only returns an empty string
            // end element, set item
            productList.add(prod);
            break;
        case "status":
            prod.setStatus(content);
            break;
        // ... etc....
    }

}

@Override
public void characters(final char[] ch, final int start, final int length) throws SAXException {
    content = "";
    content = String.copyValueOf(ch, start, length).trim();
}

<item/>元素外,此处理程序对所有感兴趣的内容都能正常工作。它总是返回一个空字符串。

如果我向println()方法添加characters()以打印content,我可以看到解析器最终会打印<item/>的内容,但它是在预期之后(在解析器的下一个额外characters()方法调用上)

引用http://docs.oracle.com/javase/tutorial/jaxp/sax/parsing.html,我知道我应该尝试汇总从characters()返回的字符串,但是我不知道这是怎么回事,因为我确实需要检索其他元素&#39 ; s数据,并将第一个元素的异常硬编码到characters()方法中似乎是错误的方法。

如何使用SAX来检索混合内容<item/>的数据&#39; ABC123&#39;?

1 个答案:

答案 0 :(得分:1)

如果商品内容仅由status元素的开头标记之前的文字组成,那么您可以在startElement中获取商品内容:

public void startElement(final String uri, 
    final String localName, final String qName, final Attributes attributes) throws SAXException {

    final String fixedQName = qName.toLowerCase();
    switch (fixedQName) {
         case "item":
             prod = new Product();
             break;
         case "status":
             prod.setItem(content);
             break;
    }
}

要了解事件的流程:

  • startElement item
  • 字符"ABC123"
  • startElement status
  • 字符"UPDATE"
  • endElement status
  • 字符""
  • endElement item