1. 程式人生 > >xml和xml解析

xml和xml解析

lan win 字符 依賴 modify 增刪改 fir email 容易

1.簡介XML

XML 可擴展標記語言,傳輸數據

HTML超文本標記語言,顯示數據

XML 文檔聲明 只能放在第一行,註釋不能放在聲明之前

    <?xml version="1.0" encoding="UTF-8" standalone="no"?> standalone表示文檔是否依賴其他文檔。

XML元素:xml標簽,必須有且僅有一個根標簽,元素中的屬性不能重復,屬性名稱可以當做子標簽去定義

  技術分享圖片

    

xml中不會忽略主體內容出現的空格和換行
//從元素集合內找到第一個子元素
Element name = (Element)linkman.getFirstChild();

特殊字符

技術分享圖片

CDATA區 解析器不會對CDATA區中的內容進行解析,直接原樣輸出。

  <![CDATA[數據內容]]>

  

2.XML約束 dtd 約束與 schema約束

 約束的好處:可以去規範我們的xml標簽(根據自己的要求)可以在工具上有相應的提示;

 dtd與schema的區別:

     dtd沒有人約束它,容易寫錯,功能簡單;

   Schema:Schema本身是xml文件,有相應的標簽約束它,功能更加強大;

  

3.DOM模型(文檔對象模型)  

對象:

Document(文檔),Element(標簽元素),Text(文本對象), Attribute(屬性對象)

一切皆節點,所有的對象都是Node對象,所以對象之間都是有關系的;

我們使用反射的開端是得到class,而對於XML的解析,一切的開始都要找到document對象;

4.原生API解析XML 使用Java提供的API去解析XML ----- JAXP (Java API for XML)

解析XML--其實就是對XML進行增刪改查, 它將xml文檔中的所有內容讀取出來,然後進行封裝並放在內存裏面..

我們去拿它,去修改他都是去操作的內存中的數據;使用TransFormer類 把 內存中的數據 同步到xml裏面去

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE contacts SYSTEM "contacts.dtd">
<contacts>
	<linkman>
		<name>gg</name>
		<email>[email protected]</email>
		<address>成都</address>
		<group>源代碼教育</group>
	</linkman>
	<linkman>
		<name>mm</name>
		<email>[email protected]</email>
		<address>成都</address>
		<group>源代碼教育</group>
	</linkman>
</contacts>

  

package TestJAXP;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class TestJAXP {
	
/*取出第二個聯系人的名字*/
	@Test
	public void select() throws SAXException, IOException, ParserConfigurationException {
		File file = new File("F:\\workspace\\TestXml\\src\\TestJAXP\\contacts.xml");
		//1. 獲得dom 對象,並拿到根元素
		Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
		Element root = dom.getDocumentElement();
		//2.通過標簽名拿到根節點的該多個子元素,並拿到第二個linkman.
		NodeList linkmans = root.getElementsByTagName("linkman");
		Element  linkman2 = (Element) linkmans.item(1);
		//3.拿到第二聯系人所有name元素
		NodeList names = linkman2.getElementsByTagName("name");
		Element name =  (Element) names.item(0);  //(效果一樣) Node name =  names.item(0);
		//5.拿到name中的文本值
		String nameText = name.getTextContent();
		System.out.println(nameText);
	}
	
/*增加一個聯系人信息*/
	@Test
	public void add() throws Exception{
		File file = new File("F:\\workspace\\TestXml\\src\\TestJAXP\\contacts.xml");
		//1. 獲得dom 對象,並拿到根元素。
		Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
		Element root = dom.getDocumentElement();
		//2.創建一個linkman子元素,並將其放入根節點中。
		Element linkman = dom.createElement("linkman");
		root.appendChild(linkman);
		//3.為創建的標簽添加元素
		Element name  = dom.createElement("name");
		name.setTextContent("李四");
		linkman.appendChild(name);
		Element email  = dom.createElement("email");
		email.setTextContent("[email protected]");
		linkman.appendChild(email);
		Element adress  = dom.createElement("adress");
		adress.setTextContent("北京");
		linkman.appendChild(adress);
		Element group  = dom.createElement("group");
		group.setTextContent("中國");
		linkman.appendChild(group);
		
		//4. 對內存中修改的數據,同步到磁盤的XML文件中
	//獲取Transformer轉換器對象,得先拿到同步的對象工廠--TransformerFactory.newInstance()
		Transformer trant = TransformerFactory.newInstance().newTransformer();
	//創建Source對象(綁定doc對象)--拿到內存中的數據     和      Result對象(綁定文件對象)--拿到磁盤上的文件 
		Source xmlSource = new DOMSource(dom);
		Result outputTarget = new StreamResult(file);
		trant.transform(xmlSource, outputTarget);
	}
	
/*刪除第三個聯系人*/
	@Test
	public void delete() throws Exception{
		File file = new File("F:\\workspace\\TestXml\\src\\TestJAXP\\contacts.xml");
		//1. 獲得dom 對象,並拿到根元素。
		Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
		Element root = dom.getDocumentElement();
		//2.拿到第三個linkman。
		Element linkman3 = (Element) dom.getElementsByTagName("linkman").item(2);
		//3. 通過其父元素幹掉他
		linkman3.getParentNode().removeChild(linkman3);
		//4.同步
		Transformer trant = TransformerFactory.newInstance().newTransformer();
		Source xmlSource = new DOMSource(dom);
		Result outputTarget = new StreamResult(file);
		trant.transform(xmlSource, outputTarget);
	}
	
/*修改第一個聯系人的郵箱*/
	@Test
	public void modify() throws Exception{
		File file = new File("F:\\workspace\\TestXml\\src\\TestJAXP\\contacts.xml");
		//1. 獲得dom 對象,並拿到根元素。
		Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
		Element root = dom.getDocumentElement();
		//2.拿到第一個linkman 元素
		Element linkman1 = (Element) root.getElementsByTagName("linkman").item(0);
		//3.拿到第一個linkman元素的 email元素,並修改值。
		Element email = (Element) linkman1.getElementsByTagName("email").item(0);
		email.setTextContent("[email protected]");
		//4.同步
		Transformer trant = TransformerFactory.newInstance().newTransformer();
		Source xmlSource = new DOMSource(dom);
		Result outputTarget = new StreamResult(file);
		trant.transform(xmlSource, outputTarget);
	}
}

  

5. 使用Dom4J進行解析xml

  

package TestDOM4J;

import java.io.File;
import java.io.FileWriter;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;



public class testDOM4J {
	
/* 獲取第二聯系人的名字*/
	@Test
	public void select() throws Exception {
		//1.通過Dom4J獲取dom 對象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("F:\\workspace\\TestXml\\src\\TestDOM4J\\contacts.xml"));
		System.out.println(doc);
		//2.獲得根節點
		Element root = doc.getRootElement();
		//3.拿到linkman,並獲取第二個linkman
		List<Element> linkmans = root.elements("linkman");
		Element linkman2 = linkmans.get(1);

          //4.拿到linkman2的name對象
          Element name = linkman2.element("name");
          String str = name.getText();
          System.out.println(str);

	}
/* 增加一個聯系人*/
	@Test
	public void add() throws Exception {
		//1.通過Dom4J獲取dom 對象
		File file = new File("F:\\workspace\\TestXml\\src\\TestDOM4J\\contacts.xml");
		SAXReader reader = new SAXReader();
		Document doc = reader.read(file);
		//2.獲得根節點
		Element root = doc.getRootElement();
		//3.直接給元素添加節點,設置值
		Element linkman = root.addElement("linkman");
		linkman.addElement("name").setText("張三");
		linkman.addElement("email").setText("[email protected]");
		linkman.addElement("adress").setText("上海奉賢");
		linkman.addElement("group").setText("中國");	
		//4.把修改後的內存中數據 存儲到 硬盤xml 文件中,(同步,一定要關閉流)
		FileWriter fw = new FileWriter(file);
		//使用新的格式輸出
		OutputFormat of = OutputFormat.createPrettyPrint();
		XMLWriter xw = new XMLWriter(fw, of);
		xw.write(doc);
		xw.close();
		fw.close();
	}
	
/*刪除第三個聯系人信息*/
	@Test
	public void delete() throws Exception{
		File file = new File("F:\\workspace\\TestXml\\src\\TestDOM4J\\contacts.xml");
		Document doc = new SAXReader().read(file);
		Element root = doc.getRootElement();
		//拿到第三個linkman
		Element linkman3 = (Element)root.elements("linkman").get(2);
		//刪除元素 ,同步
		linkman3.getParent().remove(linkman3);
		FileWriter fw = new FileWriter(file);
		doc.write(fw);
		fw.close();
	}
	
/*修改第一個聯系人的郵箱*/
	@Test
	public void modify() throws Exception{
		File file = new File("F:\\workspace\\TestXml\\src\\TestDOM4J\\contacts.xml");
		Document doc = new SAXReader().read(file);
		Element root = doc.getRootElement();
		//獲得第一聯系人的郵箱
		Element linkman1 = (Element)root.elements("linkman").get(0);
		Element email = linkman1.element("email");
		email.setText("[email protected]");
		//同步
		FileWriter fw = new FileWriter(file);
		doc.write(fw);
		fw.close();
	}
}

  

xml和xml解析