XML文档结构分析
获取Document文档对象
DOM(DocumentObject Model):文档对象模型.把XML文件中的不同结构抽象成一个个对象.
或者说,使用面向对象的方式来解析XML.
------------------------------------------------------------------------------------------
要操作XML,先就得有Document对象:
把一个XML文件加载进内存的时候,在内存中形成所谓的一种树状结构,我们把这一个结构称之为Document对象.
注意:
我们在Java代码中所做的增/删/改/查操作,都仅仅是操作的是内存中的Document对象,和磁盘中的XML文件没有关系.
比如:删除一个联系人信息之后,XML文件中数据依然存在,此时出现内存中的数据和磁盘文件中的数据不同步,所以,对于增删改操作,我们需要做同步操作(把内存中的数据和磁盘的XML文件数据保持一致).
DOM:在第一次的时候就会把XML文件加载进内存,如果XML文件过大,可能会造成内存的溢出.
DOM:在做增删改查操作的时候比较简单,但是性能却不高(线性搜索).
获取Document文档对象:
1):表示出需要被操作的XML文件的路径,注意是文件的路径,不是文件所在的目录.
File f = newFile("D:/JavaApps/dom-dom4j/contacts.xml");
2):根据DocumentBuilderFactory类,来获取DocumentBuilderFactory对象.
注意:工厂设计模式往往体现着单例设计模式.
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
3):根据DocumentBuilderFactory对象,构建DocumentBuilder对象.
注意:XxxFactory,就是用来创建Xxx对象的.
DocumentBuilder builder =factory.newDocumentBuilder();
4):根据DocumentBuidler对象,构建Document对象.
Document doc = builder.parse(f);
DOM操作练习需求1、得到某个具体的文本节点的内容:取出第二个联系人的名字.
操作步骤:
①:获取Document文档对象.
②:获取XML的根元素对象:contacts.
③:获取根元素下的第二个linkman元素.
④:获取该linkman元素下的第一个name元素.
⑤:获取该name元素的文本内容.
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class FindXml {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
File f = new File("F:/java/javaApp/XML/cc.xml");
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document root = builder.parse(f);
NodeList nodelist = root.getElementsByTagName("linkman");
Element item = (Element) nodelist.item(1);
Element nameEl = (Element) item.getElementsByTagName("name").item(0);
String name = nameEl.getTextContent();
System.out.println(name);
}
}
修改xml并且保存到文件
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
public class DoucmentRevise {
/**
* @param args
* @throws Exception
* @throws IOException
* @throws SAXException
*/
public static void main(String[] args) throws SAXException, IOException, Exception {
File f = new File("info.xml");
Document root = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
Element nameEl = (Element) root.getElementsByTagName("linkman").item(1);
Element nameEL = (Element) nameEl.getElementsByTagName("name").item(0);
nameEL.setTextContent("xiaoyi");
Transformer trans = TransformerFactory.newInstance().newTransformer();
Source xmlSource = new DOMSource(root);
Result outputTarget = new StreamResult(f);
trans.transform(xmlSource, outputTarget);
}
}
向指定元素节点中增加子元素节点:增加一个联系人信息
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
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.xml.sax.SAXException;
public class DocumentAddElements {
/**
* @param args
* @throws Exception
* @throws IOException
* @throws SAXException
*/
public static void main(String[] args) throws SAXException, IOException, Exception {
File f = new File("info.xml");
Document root = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
Element doc = root.getDocumentElement();
Element linkmanEl = root.createElement("linkman");
Element nameEl = root.createElement("name");
Element ageEl = root.createElement("age");
nameEl.setTextContent("吴彦祖");
ageEl.setTextContent("34");
linkmanEl.appendChild(nameEl);
linkmanEl.appendChild(ageEl);
doc.appendChild(linkmanEl);
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(new DOMSource(root), new StreamResult(f));
}
}
设置元素的属性和得到元素的属性
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
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.xml.sax.SAXException;
public class DocumentSetAtt {
/**
* @param args
* @throws Exception
* @throws IOException
* @throws SAXException
*/
public static void main(String[] args) throws SAXException, IOException, Exception {
File f = new File("info.xml");
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
Element linmanEl = (Element) doc.getElementsByTagName("linkman").item(0);
String id = linmanEl.getAttribute("id");
System.out.println(id);
//设置吴彦祖id为3
Element wuEl = (Element) doc.getElementsByTagName("linkman").item(2);
wuEl.setAttribute("id", "3");
//同步操作
Transformer trans = TransformerFactory.newInstance().newTransformer();
Source xmlSource = new DOMSource(doc);
Result outputTarget = new StreamResult(f);
trans.transform(xmlSource, outputTarget);
}
}
删除子结点元素
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
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.xml.sax.SAXException;
public class DocumentDel {
/**
* @param args
* @throws Exception
* @throws IOException
* @throws SAXException
*/
public static void main(String[] args) throws SAXException, IOException, Exception {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("info.xml"));
Element root = doc.getDocumentElement();
Element linkmanEl = (Element) doc.getElementsByTagName("linkman").item(2);
linkmanEl.getParentNode().removeChild(linkmanEl);
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(new File("info.xml")));
}
}
创建新的xml并且设置内容
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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;
public class DocumentCreat {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
File f = new File("xx.xml");
//设置文档对象
Document doc = null;
//设置节点最高
Element root = null;
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
if(f.exists()){
builder.parse(f);
}else{//如果文件不存在
doc = builder.newDocument();
//设置xml版本号
doc.setXmlVersion("1.0");
//创建根元素
root = doc.createElement("contacts");
//和doc关联,contacts是顶级元素
doc.appendChild(root);
}
//创建元素
Element linkmanEl = doc.createElement("linkmaEl");
Element nameEl = doc.createElement("name");
Element ageEl = doc.createElement("age");
//创建的元素添加内容
nameEl.setTextContent("will");
ageEl.setTextContent("18");
//加入到父节点
linkmanEl.appendChild(nameEl);
linkmanEl.appendChild(ageEl);
//根节点 添加创建的节点
root.appendChild(linkmanEl);
//同步操作
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(f));
}
}
dom4j查询所有信息
package dom4j;
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4jTest {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
File f = new File("info.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(f);
Element root = doc.getRootElement();
List<Element> elements = root.elements("linkman");
for (Element element : elements) {
String id = element.attributeValue("id");
String name = element.elementText("name");
String age = element.elementText("age");
System.out.println("id="+id+",name="+name+",age="+age);
}
}
}
dom4j增加一个联系人
package dom4j;
import java.io.File;
import java.io.FileWriter;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4jCreat {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
File f = new File("info.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(f);
Element root = doc.getRootElement();
Element linkmanEl = root.addElement("linkman");
linkmanEl.addAttribute("id", "5");
linkmanEl.addElement("name").setText("西门吹雪");
linkmanEl.addElement("age").setText("33");
//同步操作 快捷保存
//FileWriter out = new FileWriter(f);
//doc.write(out);
//out.close();
//同步操作,好看的保存方式
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileWriter(f),format);
writer.write(doc);
writer.close();
}
}