Java SaxParser 获取空值,未找到标记

Java SaxParser gets null value, tag not found

为了开始学习使用 Saxparser,我有一个非常小的 XML 文件要解析。 我的 XML 文件:

编辑:(注意:每个条目都有一个 ID 用于标识。我最后的目标是能够解析一个更复杂的 xml 文件,每个文件都有一个 ID)

<entry id="2000" >
  <word>"hello"</word>
</entry>

现在我创建一个条目class:

public class Entry {
private int id;
private String word;

public int getID() {
    return id;
}

public void setID(int id) {
    this.id = id;
}

public String getWord() {
    return word;
}

public void setWord(String word) {
    this.word = word;
}

@Override
public String toString() {
    return "Entry:: ID="+this.id+" word=" + this.word;
}
}

我的扩展默认处理程序:

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.List;


public class MyHandler extends DefaultHandler {
private List<Entry> wordList = null;
private Entry word = null;

public List<Entry> getwordList() {
    return wordList;
}

boolean bword = false;

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if (qName.equalsIgnoreCase("entry")) {
        String id = attributes.getValue("id");
        word = new Entry();
        word.setID(Integer.parseInt(id));
        if (wordList == null) {
            wordList = new ArrayList<>();
        } else if (qName.equalsIgnoreCase("word")) {
            bword = true;
        }
    }
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
    if (qName.equalsIgnoreCase("entry")) {
        wordList.add(word);
    }
}

@Override
public void characters(char ch[], int start, int length) throws SAXException {
    if (bword) {
        word.setWord(new String(ch, start, length));
        bword = false;
    }
}

}

最后我 运行 在这里:

import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
import java.io.IOException;
import java.util.List;

public class Main {

public static void main(String[] args) {
    SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
    try {
        SAXParser saxParser = saxParserFactory.newSAXParser();
        MyHandler handler = new MyHandler();
        saxParser.parse(new File("/home/user/Desktop/test.xml"), handler);
        //get verb liste
        List<Entry> wordList = handler.getwordList();
        //print verb
        for (Entry word : wordList)
            System.out.print(word);
    } catch (ParserConfigurationException | SAXException | IOException e) {
        e.printStackTrace();
    }
}
}

结果如下:

   Entry:: ID=2000 word=null

我知道问题出在 startElement 的某处,因为它将我的 bword 设置为 false 或者它无法识别标签。因为如果我将 characters 方法设置为 true for if (bword) { 等等,它会给我

  Entry:: ID=2000 word=

而不是

 Entry:: ID=2000 word=null

在 class MyHandler 中你有一个 "German"?单词...

if (qName.equalsIgnoreCase("eintrag")) {

估计是入门

例外是因为

您没有检查并非所有子元素都没有属性 id...就像 Word 元素...

这里是:

String id = attributes.getValue("id");
    word = new Entry();

        word.setID(Integer.parseInt(id));

id 为 null 然后你将尝试解析为 int 一个正在爆炸代码的 null...

感谢@fukanchic 解释并指出错误:花括号设置错误

此处是更正后的 MyHandler 部分。

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.ArrayList;
import java.util.List;


public class MyHandler extends DefaultHandler {
private List<Entry> wordList = null;
private Entry word = null;

public List<Entry> getwordList() {
return wordList;
}

boolean bword = false;

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    if (qName.equalsIgnoreCase("entry")) {
    String id = attributes.getValue("id");
    word = new Entry();
    word.setID(Integer.parseInt(id));
    if (wordList == null) 
        wordList = new ArrayList<>();
    } else if (qName.equalsIgnoreCase("word")) {
        bword = true;
    }
}


@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("entry")) {
    wordList.add(word);
}
}

@Override
public void characters(char ch[], int start, int length) throws SAXException {
if (bword) {
    word.setWord(new String(ch, start, length));
    bword = false;
    }
   }

}