如果有任何帮助,我将不胜感激。 这是我编写的第一个处理程序。
我得到了返回 XML 链接的 REST Web 服务。它的结构很简单,也不深。 我为此编写了一个处理程序:
public class SAXHandlerLnk extends DefaultHandler {
public List<Link> lnkList = new ArrayList();
Link lnk = null;
private StringBuilder content = new StringBuilder();
@Override
//Triggered when the start of tag is found.
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equals("link")) {
lnk = new Link();
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equals("link")) {
lnkList.add(lnk);
}
else if (qName.equals("applicationCode")) {
lnk.applicationCode = content.toString();
}
else if (qName.equals("moduleCode")) {
lnk.moduleCode = content.toString();
}
else if (qName.equals("linkCode")) {
lnk.linkCode = content.toString();
}
else if (qName.equals("languageCode")) {
lnk.languageCode = content.toString();
}
else if (qName.equals("value")) {
lnk.value = content.toString();
}
else if (qName.equals("illustrationUrl")) {
lnk.illustrationUrl = content.toString();
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
content.append(ch, start, length);
}
}
返回的某些 XML 可以为空,例如。或者 。不幸的是,当发生这种情况时,我的处理程序会将先前的值添加到对象 lnk 中。所以当 XML 中为空时,我得到 lnk.illustrationUrl = content;等于 lnk.value。
Link{applicationCode='onedownload', moduleCode='onedownload',...}
在上面的示例中,我希望 moduleCode 为空或 null,因为在 XML 中它是一个空标记。
这是调用类:
public class XMLRepositoryRestLinksFilterSAXParser {
public static void main(String[] args) throws Exception {
SAXParserFactory parserFactor = SAXParserFactory.newInstance();
SAXParser parser = parserFactor.newSAXParser();
SAXHandlerLnk handler = new SAXHandlerLnk();
parser.parse({URL}, handler);
for ( Link lnk : handler.lnkList){
System.out.println(lnk);
}
}
}
最佳答案
就像我的评论中所述,您需要执行以下操作。回调通常按 startElement
、characters
、(嵌套?)、characters
、endElement
顺序调用,其中 (嵌套?)表示整个序列的可选重复。
@Override
//Triggered when the start of tag is found.
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
content = null;
if (qName.equals("link")) {
lnk = new Link();
}
}
请注意,文档中的每个 XML 元素可能会多次调用 characters
,因此您当前的代码可能无法捕获所有内容。您最好使用 StringBuilder
而不是 String
对象来保存字符内容并附加到它。请参阅this answer举个例子。
关于Java SAX 无法正确解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25442568/