xml和xml解析
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解析