前段时间做了一个两个项目之间同步数据的接口,主要就是用到了xml作为数据的载体,主要技术就是解析和创建xml.
解析和创建xml的方法有很多,以前一直用dom4j的saxReader比较多.这次做项目接触到了一个documentHelper.所以记录一下dom4j中saxReader和documentHelper对于xml相关的使用.源码看这里
maven依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
首先是一个静态代码块用于模拟数据,以及一些变量的初始化
private static List<Map<String,String>> students = new ArrayList<Map<String,String>>();//模拟学生集合
private static Map<String,String> student = null; //模拟student对象
private static final String filePath = "D:\\test.xml";//存放xml文件位置
/**
* 初始化数据
*/
static{
student = new HashMap<String,String>();
student.put("name", "麦迪");
student.put("sex", "man");
student.put("addr", "hlj");
students.add(student);
student = new HashMap<String,String>();
student.put("name", "zwl");
student.put("sex", "woman");
student.put("addr", "ah");
students.add(student);
}
1.创建xml,并返回xml字符串
/**
* 创建xml 返回xml字符串
* @return
*/
private static String createXml(){
Document doc = DocumentHelper.createDocument();//DocumentHelper创建document对象
Element root = doc.addElement("Results");//创建根节点
Element studentsElem = root.addElement("students");
for( Map<String,String> student:students){//遍历集合 创建子节点
Element studentElem = studentsElem.addElement("student");
studentElem.addElement("name").addText(student.get("name"));
//创建节点并增加文本 (<sex id="test">man</sex> name->sex text->man attribute->(id:test(value)))
studentElem.addElement("sex").setText(student.get("man"));//set,add都可以添加文本
studentElem.addElement("addr").addText(student.get("addr"));
// studentElem.addAttribute("name",student.get("name") );//<student name="yz">
System.out.println(studentElem.getName());//student
System.out.println(studentElem.getText());//""//如果还有子节点 则text为""
System.out.println(studentElem.getStringValue());//yzmanhlj 获取所有子节点text
System.out.println(studentElem.elementText("sex"));//yz 获取子节点name等于sex的text 可以使用studentElem.element("sex") 获取sex节点
System.out.println(studentElem.elements());//子节点集合
}
return doc.asXML();//文档对象座位xml返回
};
2.创建xml文件,写入磁盘
private static void createXmlOutAsFile(){
Document doc = DocumentHelper.createDocument();
Element root = doc.addElement("Results");
Element studentsElem = root.addElement("students");
for( Map<String,String> student:students){
Element studentElem = studentsElem.addElement("student");
studentElem.addElement("name").addText(student.get("name"));
studentElem.addElement("sex").setText(student.get("sex"));;
studentElem.addElement("addr").addText(student.get("addr"));
}
//输出格式
OutputFormat format = OutputFormat.createPrettyPrint();
//设置编码
format.setEncoding("UTF-8");
XMLWriter write;
try {
File f = new File(filePath);
write = new XMLWriter(new FileOutputStream(f),format );
write.write(doc);
write.flush();
write.close();
} catch (Exception e) {
e.printStackTrace();
}
};
3.documentHelper解析xml
/**
* DocumentHelper解析xml DocumentHelper只能读取String 不能读取文件路径
*/
private static void parseXMLByDocumentHelper(){
try {
InputStream is = new FileInputStream(filePath);
ByteArrayOutputStream os = new ByteArrayOutputStream();
int length;
byte[] temp = new byte[1024];
while ((length=(is.read(temp)))>0) {
os.write(temp, 0, length);
}
StringBuffer xml = new StringBuffer(os.toString());
Document doc = DocumentHelper.parseText(xml.toString());//解析xml字符串形成document对象
Element root = doc.getRootElement();//获取根节点
Element studentsElem = root.element("students");//获取students节点
for (Iterator i= studentsElem.elementIterator("student");i.hasNext();) {//遍历students下面的student节点
Element elem = (Element) i.next();
System.out.println(elem.elementText("name"));//获取子节点name的text
System.out.println(elem.elementText("sex"));
System.out.println(elem.elementText("addr"));
// System.out.println(elem.getName());//student
// System.out.println(elem.getText());//"" 因为还有子节点 所有student的text为""
// System.out.println(elem.element("name").getText());//获取子节点name的text
}
} catch (Exception e) {
e.printStackTrace();
}
}
4.saxReader解析xml
/**
* SAXReader解析xml SAXReader读取文件路径
*/
private static void parseXMLBySaxReader(){
SAXReader sax = new SAXReader();
try {
Document doc = sax.read(filePath);
Element root = doc.getRootElement();
searchDoc(root);//递归遍历节点
} catch (Exception e) {
e.printStackTrace();
}
}
private static void searchDoc(Element elem) {
List<Element> elems = elem.elements();
for(Element ele:elems){
System.out.println("Name:"+ele.getName());
System.out.println("Text:"+ele.getText());
if(ele.elements().size()>0){
searchDoc(ele);
}
}
}
本片文章只是简单介绍了dom4j的对于xml的解析与创建,我们还可以对其进行增加节点删除修改等操作,有兴趣的自行百度~~~
以下为生成的xml文件