xml和xml解析
Posted gshao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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解析的主要内容,如果未能解决你的问题,请参考以下文章