xml和xml解析
1.簡介XML
XML?可擴(kuò)展標(biāo)記語言,傳輸數(shù)據(jù)
HTML超文本標(biāo)記語言,顯示數(shù)據(jù)
?
XML?文檔聲明? 只能放在第一行,注釋不能放在聲明之前
<?xml version="1.0" encoding="UTF-8" standalone="no"?>??standalone表示文檔是否依賴其他文檔。
XML元素:xml標(biāo)簽,必須有且僅有一個根標(biāo)簽,元素中的屬性不能重復(fù),屬性名稱可以當(dāng)做子標(biāo)簽去定義。
xml中不會忽略主體內(nèi)容出現(xiàn)的空格和換行 //從元素集合內(nèi)找到第一個子元素 Element name = (Element)linkman.getFirstChild();
?
?特殊字符
?
?
CDATA區(qū)? 解析器不會對CDATA區(qū)中的內(nèi)容進(jìn)行解析,直接原樣輸出。
<![CDATA[數(shù)據(jù)內(nèi)容]]>
2.XML約束? ??dtd 約束與 schema約束
約束的好處:可以去規(guī)范我們的xml標(biāo)簽(根據(jù)自己的要求),可以在工具上有相應(yīng)的提示;
? dtd與schema的區(qū)別:
?dtd沒有人約束它,容易寫錯,功能簡單;
? ? ? ? Schema:Schema本身是xml文件,有相應(yīng)的標(biāo)簽約束它,功能更加強(qiáng)大;
3.DOM模型(文檔對象模型)
對象:
?
Document(文檔),Element(標(biāo)簽元素),Text(文本對象), Attribute(屬性對象)
?
一切皆節(jié)點(diǎn),所有的對象都是Node對象,所以對象之間都是有關(guān)系的;
我們使用反射的開端是得到class,而對于XML的解析,一切的開始都要找到document對象;
?
4.原生API解析XML?? ? ??使用Java提供的API去解析XML? -----? ? JAXP? (Java?? API? for XML)
?
解析XML--其實(shí)就是對XML進(jìn)行增刪改查,? 它將xml文檔中的所有內(nèi)容讀取出來,然后進(jìn)行封裝并放在內(nèi)存里面..
我們?nèi)ツ盟?去修改他都是去操作的內(nèi)存中的數(shù)據(jù);使用TransFormer類 把 內(nèi)存中的數(shù)據(jù) 同步到xml里面去
?
xml文件
?
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE contacts SYSTEM "contacts.dtd"> <contacts><linkman><name>gg</name><email>gg@itsource.cn</email><address>成都</address><group>源代碼教育</group></linkman><linkman><name>mm</name><email>lanyotech@qq.com</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 {/*取出第二個聯(lián)系人的名字*/@Testpublic 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.通過標(biāo)簽名拿到根節(jié)點(diǎn)的該多個子元素,并拿到第二個linkman.NodeList linkmans = root.getElementsByTagName("linkman");Element linkman2 = (Element) linkmans.item(1);//3.拿到第二聯(lián)系人所有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);}/*增加一個聯(lián)系人信息*/@Testpublic 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.創(chuàng)建一個linkman子元素,并將其放入根節(jié)點(diǎn)中。Element linkman = dom.createElement("linkman");root.appendChild(linkman);//3.為創(chuàng)建的標(biāo)簽添加元素Element name = dom.createElement("name");name.setTextContent("李四");linkman.appendChild(name);Element email = dom.createElement("email");email.setTextContent("11@163.com");linkman.appendChild(email);Element adress = dom.createElement("adress");adress.setTextContent("北京");linkman.appendChild(adress);Element group = dom.createElement("group");group.setTextContent("中國");linkman.appendChild(group);//4. 對內(nèi)存中修改的數(shù)據(jù),同步到磁盤的XML文件中//獲取Transformer轉(zhuǎn)換器對象,得先拿到同步的對象工廠--TransformerFactory.newInstance()Transformer trant = TransformerFactory.newInstance().newTransformer();//創(chuàng)建Source對象(綁定doc對象)--拿到內(nèi)存中的數(shù)據(jù) 和 Result對象(綁定文件對象)--拿到磁盤上的文件 Source xmlSource = new DOMSource(dom);Result outputTarget = new StreamResult(file);trant.transform(xmlSource, outputTarget);}/*刪除第三個聯(lián)系人*/@Testpublic 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);}/*修改第一個聯(lián)系人的郵箱*/@Testpublic 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("8888@qq.com");//4.同步Transformer trant = TransformerFactory.newInstance().newTransformer();Source xmlSource = new DOMSource(dom);Result outputTarget = new StreamResult(file);trant.transform(xmlSource, outputTarget);} }
5. 使用Dom4J進(jìn)行解析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 {/* 獲取第二聯(lián)系人的名字*/@Testpublic 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.獲得根節(jié)點(diǎn)Element root = doc.getRootElement();//3.拿到linkman,并獲取第二個linkmanList<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);
?
轉(zhuǎn)載于:https://www.cnblogs.com/gshao/p/10285345.html
總結(jié)
- 上一篇: [TypeScript] Export
- 下一篇: 反序列化 还是记一下吧