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解析的主要内容,如果未能解决你的问题,请参考以下文章

java解析xml的几种方式哪种最好?

jsoup解析xml某片段的问题

在java中解析xml有哪几种方法

java解析xml的几种方式哪种最好?

Android之DOM解析XML

Android之DOM解析XML