【问题标题】:Can't parse File and Handler in SAXParser无法在 SAXParser 中解析文件和处理程序
【发布时间】:2015-04-20 16:23:24
【问题描述】:

我正在向 SAXParser 传递一个 XML 文件和一个处理程序,但我收到了这个错误:

parse 方法的属性被定义为 (File, DefaultHandler) 完全匹配,所以我不确定我哪里出错了。这是完整的方法:

public String readXML (File readFile) throws Exception {
    SAXParserFactory saxFactory = SAXParserFactory.newInstance();
    SAXParser saxParser = saxFactory.newSAXParser();
    final String outputString = "";
    DefaultHandler handler = new DefaultHandler() {
        boolean bArtist    = false;
        boolean bAlbumName = false;
        boolean bYear      = false;
        boolean bGenre     = false;

        public void startElement(String uri, String localName, String qName, Attributes attr)
                throws SAXException {
            if (qName.equalsIgnoreCase("ARTIST"))    { bArtist = true; }
            if (qName.equalsIgnoreCase("ALBUMNAME")) { bAlbumName = true; }
            if (qName.equalsIgnoreCase("YEAR"))      { bYear = true; }
            if (qName.equalsIgnoreCase("GENRE"))     { bGenre = true; }
        }
        public void characters(char ch[], int start, int length) {
            if (bArtist) {
                outputString.concat("Artist: " + new String(ch,start,length) + "\n");
            }
            if(bAlbumName) {
                outputString.concat("Album: " + new String(ch,start,length) + "\n");
            }
            if(bYear) {
                outputString.concat("Year: " + new String(ch,start,length) + "\n");
            }
            if(bGenre) {
                outputString.concat("Genre: " + new String(ch,start,length) + "\n");
            }
            outputString.concat("\n");
        }
    };

    saxParser.parse(readFile,handler);
    return outputString;
}

【问题讨论】:

    标签: java xml sax saxparser


    【解决方案1】:

    应该是org.xml.sax.helpers.DefaultHandler 不是jdk.internal...

    所以

    import org.xml.sax.helpers.DefaultHandler;
    

    您可能还应该定义扩展 DefaultHandler 的类,而不仅仅是内联它。

    【讨论】:

    • 为什么定义它而不是内联它更好?
    • 只是一个更好的练习。作为内部类,它持有对包含类的引用,可能存在内存泄漏。
    • 如何将其更改为类而不是内联?会不会只是创建一个以 private Handler () extends DefaultHandler { ... } 之类的东西开头的新子类?
    • 是的,但是static class Handler extends DefaultHandler { ... }如果它在您的外部类代码内部(否则它仍然具有对该类的引用),或者当然是一个完全独立的类。还要确保在方法之上添加@Overrride,它将帮助您检测潜在的导入问题,例如有许多属性类,如果导入错误的类,则不会调用方法,而是调用父类。
    猜你喜欢
    • 2015-02-28
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2012-06-30
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多