我是新手,所以为什么当我想在StartElement()中打印NAME元素的值时,对于它打印的所有3个元素都是null?
class Test {
public static void main(String args[]) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
if (qName.equals("NAME")) {
String str = attributes.getValue("NAME");
System.out.println(str);
}
}
};
saxParser.parse(new InputSource(new StringReader(xmlString)), handler);
} catch (Exception e) {
e.printStackTrace();
}
}
static String xmlString = "<PHONEBOOK>" +
" <PERSON>" +
" <NAME>Joe Wang</NAME>" +
" <EMAIL>joe@yourserver.com</EMAIL>" +
" <TELEPHONE>202-999-9999</TELEPHONE>" +
" <WEB>www.java2s.com</WEB>" +
" </PERSON>" +
" <PERSON> " +
"<NAME>Karol</NAME>" +
" <EMAIL>karol@yourserver.com</EMAIL>" +
" <TELEPHONE>306-999-9999</TELEPHONE>" +
" <WEB>www.java2s.com</WEB>" +
" </PERSON>" +
" <PERSON>" +
" <NAME>Green</NAME>" +
" <EMAIL>green@yourserver.com</EMAIL>" +
" <TELEPHONE>202-414-9999</TELEPHONE>" +
" <WEB>www.java2s.com</WEB>" +
" </PERSON>" +
" </PHONEBOOK>";
}
答案 0 :(得分:1)
您的XML 没有任何属性。所以这个:
String str = attributes.getValue("NAME");
System.out.println(str);
......永远不会打印任何东西。
您希望通过它的外观打印出NAME元素的内容。因此,当您在 NAME元素中时,您需要处理characters
事件。
顺便说一下,你 使用SAX吗?根据我的经验,与使用类似DOM的模型相比,这是一个痛苦的问题(例如使用JDOM或其他API - 内置的模型有点痛苦。)
如果您控制XML,另一种方法是使用属性启动:
<PERSON NAME="Joe Wang"
EMAIL="joe@yourserver.com"
TELEPHONE="202-999-9999"
WEB="www.java2s.com" />
然后您可以在获得attributes.getValue("NAME")
元素时使用PERSON
。
答案 1 :(得分:1)
那是因为你试图从<NAME>
元素(没有任何属性)读取属性。
String str = attributes.getValue("NAME");
要阅读<NAME>
元素的内容,您必须覆盖characters (char ch[], int start, int length)
的{{1}}方法,并显示返回的所有DefaultHandler
(字符数组)。< / p>