我有一个混合内容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;?
答案 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;
}
}
要了解事件的流程:
item
"ABC123"
status
"UPDATE"
status
""
item