各位csdn网友,哎,小弟无能,简单的java基于SAX读取xml文件也出错。
希望大家伸出你的手,救小弟一把!
代码片段:
/**
* 读取XML文件所有信息
*/
public List LoadXML(String path) throws Exception { .............
/ /获取该部门第1个二级子元素集合---many or no a depInfo
List depInfoList = depInfoRoot.getChildren();
for(int x=0;x<depInfoList.size();x++){
//获取i2个二级子元素---depInfo
Element depInfo = (Element) depInfoList.get(x);
//获取并封装depModel的属性
if(depInfo==null){
System.out.println("ok is null");
break;
}/******调试depInfo不为null但奇怪的是是获取子节点就出错了****/
System.out.println("Xml get ="+depInfo.getChild("depCode").getText());
}
希望大家伸出你的手,救小弟一把!
代码片段:
/**
* 读取XML文件所有信息
*/
public List LoadXML(String path) throws Exception { .............
/ /获取该部门第1个二级子元素集合---many or no a depInfo
List depInfoList = depInfoRoot.getChildren();
for(int x=0;x<depInfoList.size();x++){
//获取i2个二级子元素---depInfo
Element depInfo = (Element) depInfoList.get(x);
//获取并封装depModel的属性
if(depInfo==null){
System.out.println("ok is null");
break;
}/******调试depInfo不为null但奇怪的是是获取子节点就出错了****/
System.out.println("Xml get ="+depInfo.getChild("depCode").getText());
}
重新写一下代码
depInfo.getChild("depCode").getText();
问题就解决了,我真晕!
还想请问一下,
depInfo.getChildText("depCode")&depInfo.getChild("depCode").getText();
两者一样吗
depInfo.getChildText("depCode")有的时候这样获取不到值
哎
* 解析XML
* startDocument---》startElement--》characters---》endElement---》endDocument
* 注意:startElement--》characters---》endElement反复调用
*
* 取数据:解析节点--》取数据--》取数据
*
* */ 1.sax解析XML文件:<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet href="student.xsl" type="text/xsl"?>
<StudentInfo> <student>
<name>达内</name>
<sex>男</sex>
<lesson>
<lessonName>Java初级</lessonName>
<lessonScore>85</lessonScore>
</lesson>
<lesson>
<lessonName>Oracle数据库</lessonName>
<lessonScore>95</lessonScore>
</lesson>
<lesson>
<lessonName>Java中级</lessonName>
<lessonScore>80</lessonScore>
</lesson>
<lesson>
<lessonName>Java高级</lessonName>
<lessonScore>100</lessonScore>
</lesson>
</student> <breakLine /> <student>
<name>花木兰</name>
<sex>女</sex>
<lesson>
<lessonName>射箭</lessonName>
<lessonScore>100</lessonScore>
</lesson>
<lesson>
<lessonName>柔道</lessonName>
<lessonScore>95</lessonScore>
</lesson>
<lesson>
<lessonName>国学</lessonName>
<lessonScore>80</lessonScore>
</lesson>
<lesson>
<lessonName>烹饪</lessonName>
<lessonScore>60</lessonScore>
</lesson>
<lesson>
<lessonName>游泳</lessonName>
<lessonScore>70</lessonScore>
</lesson>
</student> <breakLine /></StudentInfo>2.java类如下:package com.yeg.xml;import java.io.IOException;import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;public class SAXParser { public static void main(String[] args) { SAXParser sax = new SAXParser();
sax.parseXMLFile("com//yeg//xml//student.xml");
}
/**
* 解析文档
*
* @param fileName
* XML文件的名字
*/
private void parseXMLFile(String fileName) { try {
// 通过指定解析器的名称来动态加载解析器
XMLReader parser = XMLReaderFactory
.createXMLReader("org.apache.xerces.parsers.SAXParser"); // 处理内容前要注册内容管理器
parser.setContentHandler(new XMLContentHandler()); // 开始解析文档
parser.parse(fileName);
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
}
package com.yeg.xml;import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;/**
* 解析XML
* startDocument---》startElement--》characters---》endElement---》endDocument
* 注意:startElement--》characters---》endElement反复调用
*
* 取数据:解析节点--》取数据--》取数据
*
* */
public class XMLContentHandler implements ContentHandler { // DTD中定义的元素名
private static final String ELEMENT_NAME = "name"; private static final String ELEMENT_SEX = "sex"; private static final String ELEMENT_LESSON = "lesson"; private static final String ELEMENT_LESSON_NAME = "lessonName"; private static final String ELEMENT_LESSON_SCORE = "lessonScore"; private static final String ELEMENT_STUDENT = "student"; private static final String ELEMENT_LINE = "breakLine"; // 当前元素的数据
private String currentData = ""; private String lessonName = ""; private String lessonScore = ""; /**
* 当其他某一个调用事件发生时,先调用此方法来在文档中定位。
*
* @param locator
*/
public void setDocumentLocator(Locator locator) { } /**
* 在解析整个文档开始时调用
*/
public void startDocument() throws SAXException {
System.out.println("XML文件开始解析");
} /**
* 在解析整个文档结束时调用
*/
public void endDocument() throws SAXException {
System.out.println("XML文件解析结束");
} /**
* 在解析命名空间开始时调用
*/
public void startPrefixMapping(String prefix, String uri)
throws SAXException { } /**
* 在解析命名空间结束时调用
*/
public void endPrefixMapping(String prefix) throws SAXException { } /**
* 在解析元素开始时调用
*
* @param namespaceURI
* @param localName
* @param qName
* @param atts
*/
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) throws SAXException {
System.out.println("Start");
} /**
* 在解析元素结束时调用
*
* @param namespaceURI
* @param localName
* 本地名,如student
* @param qName
* 原始名
*/
public void endElement(String namespaceURI, String localName, String qName)
throws SAXException {
if (localName.equals(ELEMENT_NAME)) {
System.out.println(localName + ":" + currentData);
} else if (localName.equals(ELEMENT_SEX)) {
System.out.println(localName + ":" + currentData);
} else if (localName.equals(ELEMENT_LESSON_NAME)) {
this.lessonName = currentData;
} else if (localName.equals(ELEMENT_LESSON_SCORE)) {
this.lessonScore = currentData;
} else if (localName.equals(ELEMENT_LESSON)) {
System.out.println(lessonName + ":" + lessonScore);
} else if (localName.equals(ELEMENT_LINE)) {
System.out.println("------------------------------------");
}
} /**
* 取得元素数据
*
* @param ch
* @param start
* @param length
*/
public void characters(char[] ch, int start, int length)
throws SAXException {
currentData = new String(ch, start, length).trim();
System.out.println("currentData-->" + currentData);
} /**
* 取得元素数据中的空白
*
* @param ch
* @param start
* @param length
*/
public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException { } /**
* 在解析到处理指令时,调用此方法。 这些处理指令不包括XML的版权指令,它由解析器本身识别。
*
* @param target
* @param data
*/
public void processingInstruction(String target, String data)
throws SAXException { } /**
* 当未验证解析器忽略实体时调用此方法
*
* @param name
*/
public void skippedEntity(String name) throws SAXException { }
}
JDK内置的W3C Dom规范API里没有getChild 和getChildren这些方法啊?不过你这个问题应该首先认识到在XML结构中<value>Hello</value>这样的情况Hello单独算一个Text节点,作为value节点的Child存在,应该先判断Child节点的类型如果是Text,就调相关专门取Text值的函数