1:// 解析方法有两种 dom(基于xml文档结构的解析) sax(基于事件流的解析) DOM4J
几种方法:
// 1:dom:解析文档 解析器读入整个文档,然后构建一个数结构的内存:有点就是整个文档数在内存中,便于操作,支持增删改查,重新排列等多种功能
缺点把所有的节点都放到内存里面了,包括一些没有用的节点,比较浪费时间和控件..试用的场景:一点解析了文档还需要多次访问这些数据;设备条件充足
// 2:sax:事件驱动.当程序解析发现元素开始元素结束文本开始文本结束的时候,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;解析代码比较少,常使用于applet,下载。缺点不是持久的。。事件过后,若没有保存数据,那就数据就丢了。无状态性,从时间中只能得到文本,但不知道该文本属于哪个元素
//3:DOM4J是一个非常优秀的java xml api.具有强大和极端易用使用的特点。同时也是一个开源代码的软件。
//4: JDOM 优点:20-80原则 极大减少了代码量。使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。
用dom创建解析代码实例:-----------------------------------------------------------------------------------------------------------------------------------------------
package test;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Dom_xml{
private Document document = null;
private String fileName = null;
public Dom_xml(String fileName) {
super();
this.fileName = fileName;
}
//初始化dom工厂
public void init(){
try {
//文档工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//文档操作对象
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.newDocument();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//创建xml
public void creatXml() throws Exception{
Element root = document.createElement("persons"); //创建根节点
Element person = document.createElement("person");
Element name = document.createElement("name");
name.appendChild(document.createTextNode("小小熊"));
Element sex = document.createElement("sex");
sex.appendChild(document.createTextNode("男"));
person.appendChild(name);
person.appendChild(sex);
root.appendChild(person);
Element person2 = document.createElement("person");
Element name1 = document.createElement("name");
name1.appendChild(document.createTextNode("熊小小"));
Element sex1 = document.createElement("sex");
sex1.setAttribute("备注", "男或女");
sex1.appendChild(document.createTextNode("男"));
person2.appendChild(name1);
person2.appendChild(sex1);
root.appendChild(person2);
document.appendChild(root);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
DOMSource source = new DOMSource(document);
transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
PrintWriter pWriter = new PrintWriter(new FileOutputStream(fileName));
StreamResult streamSource = new StreamResult(pWriter);
transformer.transform(source, streamSource);
System.out.println("创建成功!");
}
//这种方式很直白 一个一个创建,追加 输出。
//解析xml
public void parserXml(String fileName) throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(fileName);
NodeList nodeList = document.getChildNodes(); // dom 的特性 就是一次性读入整个文档
for(int i=0;i<nodeList.getLength();i++){
Node node = nodeList.item(i);
NodeList persoNode = node.getChildNodes();
for(int j=0;j<persoNode.getLength();j++){
Node person = persoNode.item(j);
NodeList list = person.getChildNodes();
for(int k=0;k<list.getLength();k++){
Node it = list.item(k);
if(it.getNodeType() == Node.ELEMENT_NODE){
System.out.println("nodeName---"+it.getNodeName());
System.out.println("nodeType---"+it.getNodeType());
System.out.println("text-------"+it.getTextContent());
NamedNodeMap map = it.getAttributes();
System.out.println("-------"+map.getNamedItem("备注"));
}
}
}
}
}
}
用dom 4j创建和解析-----------------------------------------------------------------------------------------------------------------
public class Dom4J_xml {
//创建xml
public void createXml(String fileName) {
Document document = DocumentHelper.createDocument();
Element employees=document.addElement("persons");
Element employee=employees.addElement("person");
Element name= employee.addElement("name");
name.setText("李华雄");
Element sex=employee.addElement("sex");
sex.setText("男");
Element agElement = employee.addElement("age");
agElement.setText("10");
agElement.addAttribute("mark", "--O(∩_∩)O~--");
try {
Writer fileWriter = new FileWriter(fileName);
XMLWriter xmlWriter=new XMLWriter(fileWriter);
xmlWriter.write(document);
xmlWriter.close();
fileWriter.close();
System.out.println("操作成功");
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
//解析xml
public void parserXml(String fileName){
File inputXml = new File(fileName);
SAXReader saxReader = new SAXReader();
saxReader.setEncoding("gbk");
try {
Document document = saxReader.read(inputXml);
Element employees = document.getRootElement();//根节点
for(Iterator i = employees.elementIterator(); i.hasNext();){
Element employee = (Element) i.next();
for(Iterator j = employee.elementIterator(); j.hasNext();){
Element node=(Element) j.next();
System.out.println(node.getName()+":"+node.getText());
}
}
} catch (DocumentException e) {
System.out.println(e.getMessage());
}
System.out.println("解析成功!");
}