网上对xml创建修改有很多资料就不再重复叙述,下面主要是对含有命名空间的,并且一个节点有多个属性的这种情况进行解析。
这是我的java代码。
package com.apk.openUser.utils;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.w3c.dom.NodeList;import com.apk.openUser.model.CustomItem;
public class UpdatePttXmlUtil {
public static void main(String[] args) throws IOException, DocumentException {
//Java_Write_XML(); //java写xml
CustomItem c = new CustomItem();
int userId = 8;
c.setTelName("华为t0");
CustomItem c1 = new CustomItem();
c1.setTelName("华为t0");
c1.setPttUp("ptt.up");
c1.setPttDown("ptt.down");
c1.setPttKey("220");
String be = "D:/userCustom/8华为t0/abc.xml";
//String af = "D:/userCustom/"+userId+"华为t0/";
//addPttXML(c,be,af);
updatePttXml(be,c1,c);}
public static void addPttXML(CustomItem ci,String beforePath,String aferPath) throws DocumentException, IOException {
/*
* 2.java修改xml
*/
// 创建SAXReader对象
SAXReader sr = new SAXReader(); // 需要导入jar包:dom4j
//String path = "C:/Users/Administrator/Desktop/abc.xml";
// 关联xml,dom4会自动识别,不要进行编码,否则可能导致中文乱码
//Document document = sr.read(new BufferedInputStream(new FileInputStream(beforePath)));
//Document document = sr.read(new BufferedReader(new InputStreamReader(new FileInputStream(beforePath),"utf-8")));
Document document = sr.read(new BufferedReader(new InputStreamReader(new FileInputStream(new File(beforePath)))));
//// 获取根元素
Element root = document.getRootElement();
/*
* 2. 准备xpath
* //开头表示没有深的限制,可以在文档查询子元素、子元素的子元素!
* []中放的叫谓语,其实就是查询条件
* @username表示username属性,限定其必须等于方法参数username
*/
/*
* 3. 调用document方法完成查询
*/
int itleg = 0;//0代表没有,添加机型 1代表已有进行修改。
root.addNamespace("model", "http://schemas.xxxxx");//添加命名空间
String xpath ="";
if(("").equals(ci.getPttUp())||ci.getPttUp()==null) {
xpath = "//*[@model:model='" + ci.getTelName() +"']";
}else {
xpath = "//*[@model:model='" + ci.getTelName() + "'and @model:up='"+ci.getPttUp()+"']";
}
/*输出最后一个子节点。
ListlistElement=root.elements();//所有一级子节点的list,同理一级节点的子节点listElement.elements() Element e = listElement.get(listElement.size() - 1);
ListlistAttr1=e.attributes();//当前节点的所有属性的list
for(Attribute attr:listAttr1){//遍历当前节点的所有属性
String name=attr.getName();//属性名称
String value=attr.getValue();//属性的值
System.out.println("属性名称:"+name+"属性值:"+value);
}*/Element usermodel = (Element)root.selectSingleNode(xpath);//属性值为xpath的节点
if(usermodel == null) {
Element item = root.addElement("item");
item.addAttribute("model:model", ci.getTelName());
if(ci.getPttUp()!=null&&(!("").equals(ci.getPttUp()))){
item.addAttribute("model:up", ci.getPttUp());
}
if(ci.getPttDown()!=null&&(!("").equals(ci.getPttDown()))){
item.addAttribute("model:down", ci.getPttDown());
}
if(ci.getPttKey()!=null&&(!("").equals(ci.getPttKey()))){
item.addAttribute("model:key", ci.getPttKey());
}
itleg=0;
}else{
/* //遍历某个节点的所有属性
ListlistAttr=usermodel.attributes();//当前节点的所有属性的list
for(Attribute attr:listAttr){//遍历当前节点的所有属性
String name=attr.getName();//属性名称
String value=attr.getValue();//属性的值
System.out.println("属性名称:"+name+"属性值:"+value);
}*/
if(ci.getPttKey()!=null&&(!("").equals(ci.getPttKey()))){
if(usermodel.attribute("key")==null||("").equals(usermodel.attribute("key"))){
usermodel.setAttributeValue("model:key", ci.getPttKey());
}else{
usermodel.setAttributeValue("key", ci.getPttKey());
}
}
ListlistAttr=usermodel.attributes();//当前节点的所有属性的list
for(Attribute attr:listAttr){//遍历当前节点的所有属性
String name=attr.getName();//属性名称
String value=attr.getValue();//属性的值
System.out.println("属性名称:"+name+"属性值:"+value);
}
itleg = 1;
}
//创建文件路径
String filePath = aferPath;
String fileName = "abc.xml";
OperateFileUtil dt = new OperateFileUtil();
dt.creatFile(filePath, fileName);
String file = filePath + fileName;
System.out.println(file);
saveDocument(document, new File(filePath + fileName));
}public static void updatePttXml(String path,CustomItem ci,CustomItem customItem) throws DocumentException,IOException {
try {
SAXReader sr = new SAXReader(); // 需要导入jar包:dom4j
Document document = sr.read(new BufferedReader(new InputStreamReader(new FileInputStream(new File(path)))));
Element root = document.getRootElement();
int itleg = 0;//0代表没有,添加机型 1代表已有进行修改。
root.addNamespace("model", "http://schemas.xxxxx");//添加命名空间
String xpath ="";
if(("").equals(customItem.getPttUp())||customItem.getPttUp()==null) {
xpath = "//*[@model:model='" + customItem.getTelName() +"']";
}else {
xpath = "//*[@model:model='" + customItem.getTelName() + "'and @model:up='"+customItem.getPttUp()+"']";
}
Element usermodel = (Element)root.selectSingleNode(xpath);//属性值为xpath的节点
if(usermodel!=null){
usermodel.setAttributeValue("model", ci.getTelName());
if(ci.getPttKey()!=null&&(!("").equals(ci.getPttKey()))){
if(usermodel.attribute("key")==null||("").equals(usermodel.attribute("key"))){
usermodel.setAttributeValue("model:key", ci.getPttKey());
}else{
usermodel.setAttributeValue("key", ci.getPttKey());
}
}
if(ci.getPttUp()!=null&&(!("").equals(ci.getPttUp()))){
if(usermodel.attribute("up")==null||("").equals(usermodel.attribute("up"))){
usermodel.setAttributeValue("model:up", ci.getPttUp());
}else{
usermodel.setAttributeValue("up", ci.getPttUp());
}
}
if(ci.getPttDown()!=null&&(!("").equals(ci.getPttDown()))){
if(usermodel.attribute("down")==null||("").equals(usermodel.attribute("down"))){
usermodel.setAttributeValue("model:down", ci.getPttDown());
}else{
usermodel.setAttributeValue("down", ci.getPttDown());
}
}
}// 上面的操作都在内存中
// 调用下面的静态方法完成xml的写出
saveDocument(document, new File(path));
}catch(Exception e) {
e.printStackTrace();
}
}
// 下面的为固定代码---------可以完成java对XML的写,改等操作
public static void saveDocument(Document document, File xmlFile) throws IOException {
//Writer osWrite = new OutputStreamWriter(new FileOutputStream(xmlFile));// 创建输出流//直接FileOutputStream,这样保证不乱吗,中文也能正常写入
FileOutputStream osWrite = new FileOutputStream(xmlFile);
OutputFormat format = OutputFormat.createPrettyPrint(); // 获取输出的指定格式
format.setNewlines(true);
format.setTrimText(false);
format.setPadText(true);
XMLWriter writer = new XMLWriter(osWrite, format);// XMLWriter
// 指定输出文件以及格式,缺点一直没找到和如下固定xml格式的输出,知道的可以补充
writer.write(document);// 把document写入xmlFile指定的文件(可以为被解析的文件或者新创建的文件)
//writer.flush();
writer.close();
}}
下面是我的xml文件
如果用的maven直接在pom.xml引入一下字段