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;
}
}
}
为了开始学习使用 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;
}
}
}