Java SAX 无法正确解析

标签 java xml sax saxparser

如果有任何帮助,我将不胜感激。 这是我编写的第一个处理程序。

我得到了返回 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);
        }
    }
}

最佳答案

就像我的评论中所述,您需要执行以下操作。回调通常按 startElementcharacters、(嵌套?)、charactersendElement 顺序调用,其中 (嵌套?)表示整个序列的可选重复。

@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/

相关文章:

java - 无法在从 Web 应用程序发送的 Android 应用程序中下载媒体文件

c# - 如何编写此嵌套的 Linq To Xml 查询

android - 如何在Android Studio中根据屏幕大小调整按钮大小

java - 错误: Type mismatch: cannot convert from ArrayList<Subchild> to ArrayList<String>

xml - 使用 Go 解析巨大的 XML 文件

java - 当一个巨大的 XML 文档格式不正确时该怎么办(Java)

java - 无法在当前主题 CardView 中找到样式 'cardview style ' 在 Android Studio 3.1.3 中不起作用

java - Docker主机之间的Java类路径排序不一致

c# - 如何使用 SelectSingleNode 获取属性值?

java - 遇到意外文本时抛出什么异常?