DOM解析XML
保存XML文件
获得TransformerFactory对象
创建Transformer对象
创建DOMSource对象---包含XML信息
设置输出属性---编码格式
创建StreamResult对象---包含保存文件的信息
将XML保存到指定文件中
//保存XML文件:将java内存中的document对象存储到外部xml文件中,需要借助转换器对象实现此功能
public void savaXML(String path){
//创建转换器工厂对象
TransformerFactory factory=TransformerFactory.newInstance();
//设置首行缩进,4个字符
factory.setAttribute("indent-number", "4");
try {
//通过转换器工厂对象创建转换器对象
Transformer transformer=factory.newTransformer();
//设置存储的格式
transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
// StreamResult result=new StreamResult(new FileOutputStream(path));
StreamResult result=new StreamResult(new OutputStreamWriter(new FileOutputStream(path), "gb2312"));
// StreamResult result=new StreamResult(path);
DOMSource source=new DOMSource(document);
/*
* 通过转换器对象调用方法将java内存中的document对象存储到外部xml文件中,transform(Source source,Result result)
* 需要两个参数,Source标识源头,也就是java内存中的document对象,而Source是一个接口,不能直接创建对象,可以使用其实现类DomSource
* Result表示结果,也就是java内存中的document对象要存储的位置,而Result是一个接口,不能直接创建对象,可以使用其实现类StreamResult
*/
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
添加DOM节点
通过Document调用方法创建一个元素节点
通过创建的元素节点调用方法给元素节点设置属性及属性值
将创建好的两个节点建立关系
获取xml文件中创建好的标签的上一个元素节点,然后将创建好的标签作为子节点追加到获取元素节点中,一直追加到无法追加为止
元素添加完毕之后需要将java内存中的document对象存储到xml文件中
//添加元素到XML文件中
public void add(){
//通过Document调用方法创建一个元素节点
Element element=document.createElement("Brand");
//通过创建的元素节点调用方法给元素节点设置属性及属性值
element.setAttribute("name", "三星");
//通过Document调用方法创建一个元素节点
Element ele1=document.createElement("Type");
//通过创建的元素节点调用方法给元素节点设置属性及属性值
ele1.setAttribute("name", "Note3");
//将创建好的两个节点建立关系
element.appendChild(ele1);
//获取xml文件中的第一个PhoneInfo元素节点,然后将创建好的brand标签作为子节点追加到获取的第一个PhoneInfo元素节点中
document.getElementsByTagName("PhoneInfo").item(0).appendChild(element);
//元素添加完毕之后需要将java内存中的document对象存储到xml文件中
this.savaXML("收藏信息.xml");
}
修改DOM节点
通过document对象获取你要修改的元素,将获取的元素存储在节点集合中
遍历节点集合:修改节点(给节点添加了一个id属性)
取出节点集合中的元素
将节点元素转换成其真正的类型
给元素节点添加了一个新的属性id
//修改:修改xml文件中的内容
public void update(){
//通过document对象获取你要修改的元素,将获取的元素存储在节点集合中
NodeList brands=document.getElementsByTagName("Brand");
//遍历节点集合:修改节点(给节点添加了一个id属性)
for(int i=0;i<brands.getLength();i++){
//取出节点集合中的元素
Node brand=brands.item(i);
//将节点元素转换成其真正的类型
Element eleBrand=(Element)brand;
//给元素节点添加了一个新的属性id
eleBrand.setAttribute("id", i+"");
}
this.savaXML("收藏信息.xml");
}
删除DOM节点
通过document对象获取你想要删除的元素节点,将元素节点存储在节点集合中
遍历集合 取出节点集合中的元素
将节点转换成真正的类型
从遍历出的元素节点找出你要删除的元素节点,通过元素节点的属性值来找
删除元素不能自己删除自己,需要通过其父元素来删除,getParentNode(),获取父节点 removeChild()删除子节点
public void delete(){
//通过document对象获取你想要删除的元素节点,将元素节点存储在节点集合中
NodeList brands=document.getElementsByTagName("Brand");
//遍历集合
for(int i=0;i<brands.getLength();i++){
//取出节点集合中的元素
Node brand=brands.item(i);
//将节点转换成真正的类型
Element eleBrand=(Element)brand;
//从遍历出的元素节点找出你要删除的元素节点,通过元素节点的属性值来找
if(eleBrand.getAttribute("name").equals("华为")){
//删除元素不能自己删除自己,需要通过其父元素来删除,getParentNode(),获取父节点 removeChild()删除子节点
eleBrand.getParentNode().removeChild(eleBrand);
}
}
this.savaXML("收藏信息.xml");
}
DOM4J解析XML
DOM4J
Document:定义XML文档
Element:定义XML元素
Text:定义XML文本节点
Attribute:定义了XML 的属性
使用DOM4J需要导入文件,https://dom4j.github.io/#parsing 在这里面可以找到
随便找一个,下载.jar文件。下载好之后接下来就是导入包了
将刚才下载下来的文件复制到刚刚创建的文件夹中
这样就好了。
public class Dom4j {
public static Document doc;
public static void main(String[] args) {
loadDocument();
// showPhoneInfo();
// saveXML("收藏信息.xml");
// addNewPhoneInfo();
// updatePhoneInfo();
deleteItem();
showPhoneInfo();
}
//定义方法,将xml文件转换为document对象
public static void loadDocument(){
try{
//创建SAXReader类对象,调用reader()方法将XMl文件转换为document类对象
SAXReader saxReader = new SAXReader();
doc = saxReader.read(new File("收藏信息.xml"));
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static void updatePhoneInfo(){
// 获取XML的根节点
Element root = doc.getRootElement();
int id = 0;
for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
Element brand = (Element) itBrand.next();
id++;
brand.addAttribute("id", id + "");
}
saveXML("收藏信息.xml");
}
public static void deleteItem(){
// 获取XML的根节点
Element root = doc.getRootElement();
for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
Element brand = (Element) itBrand.next();
if (brand.attributeValue("name").equals("华为")) {
//删除元素需要通过其父元素来进行删除
brand.getParent().remove(brand);
}
}
saveXML("收藏信息.xml");
}
//定义方法显示XML文件中的手机品牌和类型
public static void showPhoneInfo() {
// 获取XML的根节点
Element root = doc.getRootElement();
// 通过根节点调用elementIterator()方法获取根节点的所有子元素Brand,将获取的brand标签存储在迭代器中,然后遍历所有的Brand标签
for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
Element brand = (Element) itBrand.next();
// attributeValue(属性名: )根据属性名输出标签的name属性
System.out.println("品牌:" + brand.attributeValue("name"));
// 使用brand节点调用elementIterator()方法获取brand标签的子标签type,然后遍历Type标签
for (Iterator itType = brand.elementIterator(); itType.hasNext();) {
Element type = (Element) itType.next();
// attributeValue(属性名: )根据属性名输出标签的name属性
System.out.println("\t型号:" + type.attributeValue("name"));
}
}
}
public static void saveXML(String path){
try {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK"); // 指定XML编码
XMLWriter writer;
writer = new XMLWriter(new FileWriter(path), format);
writer.write(doc);
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void addNewPhoneInfo(){
// 获取XML的根节点
Element root = doc.getRootElement();
// 创建Brand标签
Element el = root.addElement("Brand");
// 给Brand标签设置属性
el.addAttribute("name", "三星");
// 创建Type标签
Element typeEl = el.addElement("Type");
// 给Type标签设置属性
typeEl.addAttribute("name", "Note4");
saveXML("src/收藏信息.xml");
}
}