本文介绍了如何利用DOM(即Document Object Model文档对象模型)解析xml文件。
首先有一个xml文件:
<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
<User>
<city country="中国">南京</city>
<name>刘文文</name>
<age>25</age>
<sex>男</sex>
<occupation>程序员</occupation>
</User>
利用DOM解析这个xml文件:
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
public class ParsingXml {
public static void main(String args[]) {
String xml="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n" +
"<User>\r\n" +
" <city country=\"中国\">南京</city>\r\n" +
" <name>刘文文</name>\r\n" +
" <age>25</age>\r\n" +
" <sex>男</sex>\r\n" +
" <occupation>>程序员</occupation>\r\n" +
"</User>\r\n" +
"";
DOMParsingXml(xml);
}
public static void DOMParsingXml(String xml) {
try {
byte[] b=xml.getBytes();
InputStream inp=new ByteArrayInputStream(b);
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc=builder.parse(inp);
NodeList nl=doc.getElementsByTagName("User");
for (int i = 0; i < nl.getLength(); i++) {
System.out.println("country:" + doc.getElementsByTagName("city").item(i).getAttributes().getNamedItem("country").getNodeValue());
System.out.println("city: " + doc.getElementsByTagName("city").item(i).getFirstChild().getNodeValue());
System.out.println("name: " + doc.getElementsByTagName("name").item(i).getFirstChild().getNodeValue());
System.out.println("age: " + doc.getElementsByTagName("age").item(i).getFirstChild().getNodeValue());
System.out.println("sex: " + doc.getElementsByTagName("sex").item(i).getFirstChild().getNodeValue());
System.out.println("occupation: " + doc.getElementsByTagName("occupation").item(i).getFirstChild().getNodeValue());
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
可以看到DOM解析xml文件是可以得到xml的属性值的,但是这样解析的xml有一个问题,就是当标签里的值为空的时候,解析xml文件就会报错为:java.lang.NullPointerException(空指针异常),那么我们需要在解析值可能为空的标签的时候加一次判断,是否为标准的dom格式,如果不是,则赋值为空(null),如下所示:
if (标签名 instanceof Element) {
//则为标准形式,可以取到值
}else{
//在此处赋值为空
}
运行这个程序,可以看到控制台输入结果为: