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>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 {/*取出第二个联系人的名字*/@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.通过标签名拿到根节点的该多个子元素,并拿到第二个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);}/*增加一个联系人信息*/@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.创建一个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("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. 对内存中修改的数据,同步到磁盘的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);}/*删除第三个联系人*/@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);}/*修改第一个联系人的邮箱*/@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进行解析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 {/* 获取第二联系人的名字*/@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.获得根节点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);
}
/* 增加一个联系人*/@Testpublic 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("1434314.@qq.com");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();}/*删除第三个联系人信息*/@Testpublic 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();//拿到第三个linkmanElement linkman3 = (Element)root.elements("linkman").get(2);//删除元素 ,同步linkman3.getParent().remove(linkman3);FileWriter fw = new FileWriter(file);doc.write(fw);fw.close();}/*修改第一个联系人的邮箱*/@Testpublic 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("1633333@163.com");//同步FileWriter fw = new FileWriter(file);doc.write(fw);fw.close();}
}