26.Java2核心技术—读xml文件的两种方法
XMl:可扩展标记语言。xml文档大小写敏感,结束标签绝对不能省略,但可以这样即只有一个标签而没有相对应的结束标签的元素必须以 / 结尾,属性值必须用引号括
起来且属性值必须都有值。如下面的user.xml:
<?xml version="1.0" ?>
<users>
<user>
<name>Jack</name>
<gender>male</gender>
<age>90</age>
<height>182</height>
<weight>200</weight>
</user>
<user>
<name>Mike</name>
<gender>male</gender>
<age>29</age>
<height>175</height>
<weight>120</weight>
</user>
</users>
我们要处理xml文档就要解析xml文档,Java库提供了两种方法解析xml文档:
1.DOM(Document Object Model):文档对象模型,将读入的xml文档转换成树形结构,但是需要消耗大量内存。
实例代码:解析上面的user.xml
public static void main(String[] args)throws Exception {
DocumentBuilder builder = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
Document doc = builder.parse(new File("user.xml"));
Element root = doc.getDocumentElement();//返回跟元素即Users
NodeList list = root.getElementsByTagName("user");//返回跟元素下的所有名为user的子元素的节点列表
List<User> users = new ArrayList();
for(int i=0;i<list.getLength();i++){
Element user = (Element)list.item(i);
users.add(parseUser(user));
}
System.out.println(users.iterator().next().getName());
}
private static User parseUser(Element user){//解析子元素user下的子元素的内容
User u = null;
Element name = (Element)user.getElementsByTagName("name").item(0);
Element gender = (Element)user.getElementsByTagName("gender").item(0);
Element age = (Element)user.getElementsByTagName("age").item(0);
Element height = (Element)user.getElementsByTagName("height").item(0);
Element weight = (Element)user.getElementsByTagName("weight").item(0);
u = new User(name.getTextContent(),
gender.getTextContent(),
JdbcUtil.toInt(age.getTextContent().trim()),
JdbcUtil.toInt(height.getTextContent().trim()),
JdbcUtil.toInt(weight.getTextContent().trim()));
return u;
}
public static Integer toInt(String num){
Integer i = null;
try{
i = Integer.parseInt(num);
}catch(Exception e){
e.printStackTrace();
}
return i;
}
2.SAX(Simple API for XML)用于XML的简单API:SAX解析器在解析xml输入的构件时就报告事件,但不会以任何方式存储文档。使用SAX解析器时,需要一个处理器
来定义不同的解析器事件的事件动作。
实例代码:解析上面的user.xml文件
public static void main(String[] args)throws Exception {
SAXParser parser = SAXParserFactory.newInstance()
.newSAXParser();
InputStream in = new FileInputStream("user.xml");
parser.parse(in, new MySAXHandler());
in.close();
}
-------------------------处理器------------------------------
public class MySAXHandler extends DefaultHandler {
@Override
public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {
StringBuffer sb = new StringBuffer();
sb.append("<" + qName);
if (attributes.getLength() != 0) {//处理元素属性
for (int i = 0; i < attributes.getLength(); i++) {
sb.append(" " + attributes.getLocalName(i) + "=");
sb.append(attributes.getValue(i));
}
}
sb.append(">");
System.out.print(sb.toString());
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {//处理文本内容
String s = new String(ch,start,length);
System.out.print(s);
}
@Override
public void endElement(String uri, String localName, String qName)throws SAXException {
System.out.print("<" + qName+">");
}
@Override
public void startDocument() throws SAXException {
System.out.println("-----文档开始-----");
}
@Override
public void endDocument() throws SAXException {
System.out.println("\n-----文档结束-----");
}
}