最近研究xml文件 但是书上仅仅是解析 自己有点不满意 于是在“度娘谷哥”的帮助下搜集了一些有关于DOM操作xml文件的资料 并整理下来 也有0分的源码供大家下载
DOM是W3C组织推广的一中操作xml文件的方法,也是java原生态操作xml文件的方法之一,DOM的优点就是操作xml文件简单,可以重复随便的增删改查,但是不足的是,在操作前需要把整个xml文件以树状图加载到内存中,这样的话会影响程序的运行效率,所以,小的xml文件用DOM才是不错的选择
被操作的xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<clazz>
<student sn="01">
<name>张三</name>
<age>18</age>
</student>
<student sn="02">
<name>李四</name>
<age>20</age>
</student>
<student sn="03">
<name>王五</name>
<age>20</age>
</student>
</clazz>
xml文件与项目的路径关系如下:
问题:
【节点的增、删、改、查】
1、在根节点下增加一个<student>节点,添加属性sn值为04,<student>节点下有<name>、<age>节点节点内容分别为name=赵六,age=21(节点的增加)
2、在根节点下找到属性sn为02的<student>节点,并输出该节点下的姓名,年龄(节点的查询)
3、在根节点下找到属性sn为03的<student>节点,并删除该节点(节点的删除)
4、在根节点下找到属性sn为01的<student>节点,并把<student>节点修改为<teacher>(节点的修改)
【节点属性的增、删、改、查】
1、在sn=01的节点上增加属性type=班长
2、删除sn=02的sn属性
3、修改sn=03的sn属性为05
4、查询......(上面的都用到了)
【节点内容的增、删、改、查】
(其中的增与删没必要,因为增加就是改,删除也是改,删除也可以直接删除节点,所以只有改和查有意义)
1、查询sn=01的同学姓名
2、修改sn=02的同学姓名为王二
1、获取Document对象:
Document就是xml文件的“树状图”,获取Document对象需要通过工厂类去获取,下面的方法会返回一个Document对像,
public Document createDocument(){
Document document = null;
try {
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
FileInputStream xmlInputStream = new FileInputStream("xmlFile/clazzXml.xml");
DocumentBuilder builder = builderFactory.newDocumentBuilder();
document = builder.parse(xmlInputStream);
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return document;
}
2、获取根节点:
获取xml的根节点可以通过Document中的getDocumentElement()方法:
Element root = document.getDocumentElement();
3、遍历xml文件:
public void domXML(Document document){
Element root = document.getDocumentElement();
System.out.println("xml文件的根节点为:"+root.getNodeName());
System.out.println();
NodeList stuNodeList = root.getChildNodes();
for(int i = 0;i < stuNodeList.getLength();i ++){
Node stuInforNode = stuNodeList.item(i);
if(stuInforNode.getNodeType() == Node.ELEMENT_NODE){
NodeList stuNode = stuInforNode.getChildNodes();
for(int j = 0;j < stuNode.getLength();j ++){
Node stuNode2 = stuNode.item(j);
if(stuNode2.getNodeName().equals("name")){
System.out.println("姓名:"+stuNode2.getTextContent());
}
else if(stuNode2.getNodeName().equals("age")){
System.out.println("年龄:"+stuNode2.getTextContent());
}
}
}
}
}
4、为指定节点下添加子节点:
// 1、在根节点下增加一个<student>节点,添加属性sn值为04,
// <student>节点下有<name>、<age>节点节点内容分别为name=赵六,age=21(节点的增加)
public void addElement(Document document){
Element root = document.getDocumentElement();
//解决问题步骤1、创建节点 创建属性 创建内容 2、写入内容 写入属性 写入节点
//1、创建
//创建students节点以及students下的name节点与age节点
Element stuEle = document.createElement("student");
Element nameEle = document.createElement("name");
Element ageEle = document.createElement("age");
//创建name与age内容
Text nameText = document.createTextNode("赵六");
Text ageText = document.createTextNode("21");
//创建student节点属性sn=04
Attr stuAttr = document.createAttribute("sn");
stuAttr.setValue("04");
//2、写入
//写入属性
stuEle.setAttributeNode(stuAttr);
//把name、age写入student下
stuEle.appendChild(nameEle);
stuEle.appendChild(ageEle);
//写入内容
nameEle.appendChild(nameText);
ageEle.appendChild(ageText);
//把student写入根节点下
root.appendChild(stuEle);
}
该方法可以增加xml文件的节点 但是 程序执行后 打开xml文件 xml并没有改变 这好似因为我们并没有把修改过的xml重新写入到文件中 重新写入xml要使用Transformer对象
5、Transformer对象的获取 与保存修改过的xml文件
//保存xml文件
public void saveXml(Document document){
TransformerFactory transformerFactory = TransformerFactory.newInstance();
try {
Transformer transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(document);
StreamResult streamResult = new StreamResult(new FileOutputStream("xmlFile/clazzXml.xml"));
transformer.transform(domSource, streamResult);
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这样,加入修改过的Document对象 就会把修改过的xml文件保存