哪四种:JDOM、DOM4J、DOM、SAX。(目前比较常用的:JDOM、DOM4J)
第一种:JDOM
简化与XML的交互并且比使用DOM实现更快,仅使用具体类而不使用接口因此简化了API,并且易于使用。
(1).Jdom生成XML:
代码如下:<?xml version="1.0" encoding="gbk"?> <联系人列表 公司="A集团"> <联系人> <姓名>张三</姓名> <公司>A公司</公司> <电话>021-55556666</电话> <地址> <街道>5街</街道> <城市>上海</城市> <省份>上海市</省份> </地址> </联系人> </联系人列表>
import java.io.FileWriter; import java.io.StringReader; import java.util.List; import org.jdom.Attribute; import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; import org.xml.sax.InputSource; public class ParseXML_Jdom { //JDOM解析xml: public static void main(String[] args) throws Exception { Document document = new Document(); Element root = new Element("联系人列表").setAttribute(new Attribute("公司","A集团")); document.addContent(root); Element contactPerson = new Element("联系人"); root.addContent(contactPerson); contactPerson .addContent(new Element("姓名").setText("张三")) .addContent(new Element("公司").setText("A公司")) .addContent(new Element("电话").setText("021-55556666")) .addContent( new Element("地址") .addContent(new Element("街道").setText("5街")) .addContent(new Element("城市").setText("上海")) .addContent(new Element("省份").setText("上海市"))); XMLOutputter output = new XMLOutputter(Format.getPrettyFormat() .setIndent(" ").setEncoding("gbk"));//UTF-8 output.output(document, new FileWriter("D:\\contact.xml")); // Document document = new Document(); // Element root = new Element("class"); // root.setAttribute(new Attribute("classLevel","一年级")); // root.setAttribute(new Attribute("classNo","1班")); // document.addContent(root); // // Element teacher = new Element("teacher"); // teacher.setAttribute(new Attribute("name","班主任")); // teacher.setAttribute(new Attribute("sex","female")); // root.addContent(teacher); // // Element student1 = new Element("student").setAttribute(new Attribute("name","学生1")); // Element student2 = new Element("student").setAttribute(new Attribute("name","学生2")); // Element student3 = new Element("student").setAttribute(new Attribute("name","学生3")); // root.addContent(student1); // root.addContent(student2); // root.addContent(student3); // // XMLOutputter output = new XMLOutputter(Format.getPrettyFormat() // .setIndent(" ").setEncoding("gbk"));//UTF-8 // output.output(document, new FileWriter("D:\\class.xml")); System.out.println("输出成功!"); } }
(2).Jdom解析XML:
import java.io.FileWriter; import java.io.StringReader; import java.util.List; import org.jdom.Attribute; import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; import org.xml.sax.InputSource; public class ParseXML_Jdom { //JDOM解析xml: public static void main(String[] args) throws Exception { try { /* * 以下为描述班级的xml * <xml version=\"1.0\" encoding=\"UTF-8\">定义xml编码格式,可写可不写,规范是写 */ String resultXml = "<xml version=\"1.0\" encoding=\"UTF-8\">" +//这是根节点 "<class classLevel=\"一年级\" classNo=\"1班\" >" + "<teacher name=\"班主任\" sex=\"female\" />" //单数子节点!子一代:getChild + "<student name=\"学生1\" age=\"5\" seat=\"A\" />" + "<student name=\"学生2\" age=\"6\" seat=\"B\" />" + "<student name=\"学生3\" age=\"7\" seat=\"C\" />"//student复数子节点:getChildren + "</class>" + "</xml>"; StringReader read = new StringReader(resultXml); InputSource source = new InputSource(read); SAXBuilder sb = new SAXBuilder(); Document document = sb.build(source); //document.getRootElement();//得到的是根节点 Element root = document.getRootElement();//得到的是根节点 System.out.println("根节点:"+root.getName()+"-"+root.getQualifiedName()); String version = root.getAttribute("version").getValue();//根节点里的参数属性 String encoding = root.getAttributeValue("encoding");//root.getAttribute("encoding").getValue(); System.out.println(version); System.out.println(encoding); //root.getChild("$")得到的是单独唯一的一个下层字节点,是单数! Element classElement = root.getChild("class"); System.out.println("子节点一代:"+classElement.getQualifiedName()); String classLevel = classElement.getAttributeValue("classLevel"); String classNo = classElement.getAttributeValue("classNo"); System.out.println(classLevel); System.out.println(classNo); //classElement.getChild("$")得到的是单独唯一的一个下层字节点,是单数! Element teacherElement = classElement.getChild("teacher"); System.out.println("老师:"+teacherElement.getQualifiedName()); String name = teacherElement.getAttributeValue("name"); String sex = teacherElement.getAttributeValue("sex"); System.out.println(name); System.out.println(sex); //classElement.getChildren("$")得到的是一组子代,是复数 List<Element> students = classElement.getChildren("student"); System.out.println("我是一组子代:"); System.out.println(students); if(null != students){ String sname="", age="", seat=""; for(Element student : students){ sname = student.getAttributeValue("name"); age = student.getAttributeValue("age"); seat = student.getAttributeValue("seat"); System.out.println(sname+","+age+","+seat); } } } catch (Exception e) { e.printStackTrace(); } } }
第二种:DOM4J
是JDOM的一种智能分支,功能较强大,建议熟练使用。
(1).DOM4J生成以下XML:
<?xml version="1.0" encoding="UTF-8"?>
<student country="China">
<name inEnglish="San.Zhang">张三</name>
<sex>boy</sex>
</student>
生成代码如下:
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.DOMReader;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class ParseXML_Dom4j {
public static void main(String[] args) throws Exception{
try {
// 创建文档并设置文档的根元素节点 :第一种方式
// Document document = DocumentHelper.createDocument();
// Element root = DocumentHelper.createElement("student");
// document.setRootElement(root);
// 创建文档并设置文档的根元素节点 :第二种方式
Element root = DocumentHelper.createElement("student");
Document document = DocumentHelper.createDocument(root);
root.addAttribute("country", "China");
Element name = root.addElement("name");
Element sex = root.addElement("sex");
name.setText("张三");
sex.setText("boy");
name.addAttribute("inEnglish", "San.Zhang");
XMLWriter xmlWriter = new XMLWriter();
xmlWriter.write(document);//印屏:打印在console里,不在文件里
//打印格式
OutputFormat format = new OutputFormat(" ", true); //" "是为了每行缩进
//打印到指定文件:方式一
XMLWriter xmlWriter2 = new XMLWriter(new FileOutputStream("D:\\student2.xml"), format);
xmlWriter2.write(document);
//打印到指定文件:方式二
XMLWriter xmlWriter3 = new XMLWriter(new FileWriter("D:\\student3.xml"), format);
xmlWriter3.write(document);
xmlWriter3.close();
System.out.println("输入成功!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
(2).DOM4J解析XML:
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.DOMReader;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class A_ParseXML_Dom4j {
public static void main(String[] args) throws Exception{
try {
System.out.println("-------------dom4j解析方式一:--------------");
//dom4j解析方式一:
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(new File("D:\\student2.xml"));
Element root = doc.getRootElement();
System.out.println("root element: " + root.getName());
List<Element> childList = root.elements();
System.out.println(childList.size());
List<Element> childList2 = root.elements("name");
System.out.println(childList2.size());
Element first = root.element("name");
System.out.println(first.attributeValue("inEnglish"));
for(Iterator iter = root.elementIterator(); iter.hasNext();){
Element e = (Element)iter.next();
System.out.println(e.attributeValue("inEnglish"));
}
System.out.println("-------------dom4j解析方式二:--------------");
//dom4j解析方式二:利用javax.xml.parsers.*-jar包
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
org.w3c.dom.Document document = db.parse(new File("D:\\student2.xml"));
DOMReader domReader = new DOMReader();
//将JAXP的Document转换为dom4j的Document
Document d = domReader.read(document);
Element rootElement = d.getRootElement();
System.out.println(rootElement.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
第三种:DOM
DOM的全称是Document Object Model,也即文档对象模型。Dom解析是将xml文件全部载入到内存,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件,与平台无关,java提供的一种基础的解析XML文件的API,理解较简单,但是由于整个文档都需要载入内存,不适用于文档较大时。
第四种:SAX
sax:SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX基于事件驱动,逐条解析,适用于只处理xml数据,不易编码,而且很难同时访问同一个文档中的多处不同数据