java2 day03 XML DOM4J

来源:互联网 发布:上网流量统计软件 编辑:程序博客网 时间:2024/06/14 00:24

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为3Element 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();}}








0 0
原创粉丝点击