好久不用的东西,今天居然被面试官问到了。那既然这样,我们就一起回顾下java解析xml文件的几种方式吧。
DOM解析
dom解析所需依赖是我们jdk自带的,所以只需要使用jdk为我们提供的接口即可上手。
User.xml文件
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Users name="users">
<User id="1" name="user1">
<name>saber</name>
<age>18</age>
<sex>女</sex>
<emal>1426733135@saber.com</emal>
<a href="www.saber.com">saber的页面</a>
</User>
<User id="2" name="user2">
<name>lader</name>
<age>19</age>
<sex>男</sex>
<emal>1426733135@saber.com</emal>
<a href="www.saber.com">saber的页面</a>
</User>
</Users>
获取document文档对象
private Document document;//声明document
public void getDocument(){
//获取document工厂bean
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder documentBuilder = factory.newDocumentBuilder();
document = documentBuilder.parse("User.xml");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
获取xml元素
public void showInfo(){
NodeList users = document.getElementsByTagName("User");
for (int i =0;i<users.getLength();i++){
Element user=(Element) users.item(i);
NodeList childNodes = user.getChildNodes();
for (int j = 0;j<childNodes.getLength();j++){
Node item = childNodes.item(j);
System.out.println(item.getTextContent());
}
System.out.println("---------------------------");
}
NodeList div=document.getElementsByTagName("div");
NodeList divChildren=div.item(0).getChildNodes();
System.out.println(divChildren.item(0).getTextContent());
//或者
// System.out.println(document.getElementsByTagName("span").item(0).getTextContent());
}
编辑xml元素
public void deleteElement(){
NodeList divs= document.getElementsByTagName("div");
Node div=divs.item(0);
//先找到自己的父节点,然后删除指定的子节点
div.getParentNode().removeChild(div);
saveXML();
}
public void updateElement(){
Element span=(Element)document.getElementsByTagName("span").item(0);
span.setAttribute("class","index");
if(!span.hasAttribute("id")){
span.setAttribute("id","index");
}
span.setTextContent("DOM解析也不过如此");
saveXML();
}
对dom元素进行修改后一定得保存修改,也就是使用流将修改的内容重新输出到xml文件中
public void saveXML(){
TransformerFactory factory =TransformerFactory.newInstance();
factory.setAttribute("indent-number",4);//设置缩进4个空格
try {
Transformer transformer=factory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING,"utf-8");//设置字符编码
transformer.setOutputProperty(OutputKeys.INDENT,"YES");//设置是否支持缩进
DOMSource domSource=new DOMSource(document);//封装document
OutputStream out=new FileOutputStream("User.xml");
StreamResult streamResult=new StreamResult(new OutputStreamWriter(out,"utf-8"));
transformer.transform(domSource,streamResult);//更新修改
} catch (Exception e) {
throw new RuntimeException(e);
}
}
DOM4J解析请看下篇文章,java解析xml文件的几种方式(DOM4J解析)