一、XML简介

     1.  XML,即可扩展标记语言(Extendsible Markup Language),标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的标记语言。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。

    XML是一种标记语言,很类似HTML

    XML的设计宗旨是传输数据,而非显示数据

    XML标签没有被预定义,需要自定义标签

    XML被设计为具有自我描述性

    XML是W3C的推荐标准


    2.  XML与HTML

    XML不是HTML的替代品

    XML和HTML是为不同的目的而设计的

    XML被设计为传输和存储数据,其焦点是数据的内容

    HTML被设计用来显示数据,其焦点是数据的外观

    HTML旨在显示信息,而XML旨在传输信息


    3.  XML的特点

    XML仅仅是纯文本

    XML没什么特别的。它仅仅是纯文本而已。有能力处理纯文本的软件都可以处理XML

    不过,能够读懂XML的应用程序可以有针对性地处理XML的标签。标签的功能性意义依赖于程序的特性。

    XML没有预定义的标签

    在HTML中使用的标签(以及HTML的结构)是预定义的。HTML文档只能够使用在HTML中定义过的标签(比如<p>、<h1>等等)。

    XML允许创作者定义自己的标签和自己的文档结构。


    4.XML的语法规则

    XML的语法规则很简单,且很有逻辑。这些规则很容易学习,也很容易使用。

    在XML中,省略关闭标签是非法的,所有元素都必须有关闭标签。

    XML标签对大小写敏感

    XML必须正确地嵌套

    XML文档必须有根元素

    XML的属性值须加引号

    XML中,空格会被保留

    元素可以包含其他元素、文本或者两者的混合物。元素也可以拥有属性。   

<bookstore>
    <book category="CHILDREN">
        <title>Harry Potter</title>
        <author>J.K.Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
</bookstore>

    <bookstore>和<book>都拥有元素内容,因为它们包含了其他元素。<author>只有文本内容,因为它仅包含文本。

    在上例中,只有<book>元素拥有属性(category="CHILDREN")。


二、使用Java读取XML数据

<?xml version="1.0" encoding="UTF-8"?>
<Languages cat="it">
	<lan id="1">
		<name>Java</name>
		<ide>Eclipse</ide>
	</lan>
	<lan id="2">
		<name>Swift</name>
		<ide>Xcode</ide>
	</lan>
	<lan id="3">
		<name>C#</name>
		<ide>Visual Studio</ide>
	</lan>
</Languages>
package com.eduask.TestReadXML.test;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

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 ReadXML {
	
	//DOM方式解析XML
	public static void main(String[] args) {
		try {
			//创建解析器工厂并得到它的实例factory
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			//通过factory获取解析器bulider
			DocumentBuilder bulider = factory.newDocumentBuilder();
			//通过bulider获取XML文件document
			Document document = bulider.parse(new File("WebContent/WEB-INF/languages.xml"));
			//通过document获取文件中的根元素root
			Element root = document.getDocumentElement();
			System.out.println("cat="+root.getAttribute("cat"));
			//通过root获取节点列表list
			NodeList list = root.getElementsByTagName("lan");
			//遍历list
			for(int i=0; i<list.getLength(); i++){
				//通过list获取根元素下的第一层元素列表lan(标签<lan>)
				Element lans = (Element) list.item(i);
				System.out.println("--------------");
				System.out.println("id="+lans.getAttribute("id"));
				//通过lan获取其下面的一层子元素列表childList(标签<name>、<ide>)
				NodeList childList = lans.getChildNodes();
				//遍历chilidList
				for(int j=0; j<childList.getLength(); j++){
					//通过childList获取其下面的元素child
					Node child = childList.item(j);
					if(child instanceof Element){//对获取到的元素进行类型检查(不输出看不见的节点)
						System.out.println(child.getNodeName()+"="+child.getTextContent());
					}
				}
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}


三、使用Java创建XML数据

import java.io.File;
import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class CreateXML {
	
	//DOM方式操作和生成XML
	public static void main(String[] args) {
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.newDocument();
			Element root = document.createElement("Languages");
			root.setAttribute("cat", "it");
			
			Element lan1 = document.createElement("lan");
			lan1.setAttribute("id", "1");
			Element name1 = document.createElement("name");
			name1.setTextContent("java");
			Element ide1 = document.createElement("ide");
			ide1.setTextContent("Eclipse");
			lan1.appendChild(name1);
			lan1.appendChild(ide1);
			
			Element lan2 = document.createElement("lan");
			lan2.setAttribute("id", "2");
			Element name2 = document.createElement("name");
			name2.setTextContent("Swift");
			Element ide2 = document.createElement("ide");
			ide2.setTextContent("Xcode");
			lan2.appendChild(name2);
			lan2.appendChild(ide2);
			
			Element lan3 = document.createElement("lan");
			lan3.setAttribute("id", "3");
			Element name3 = document.createElement("name");
			name3.setTextContent("C#");
			Element ide3 = document.createElement("ide");
			ide3.setTextContent("Visual Studio");
			lan3.appendChild(name3);
			lan3.appendChild(ide3);
			
			root.appendChild(lan1);
			root.appendChild(lan2);
			root.appendChild(lan3);
			document.appendChild(root);
			
			//--------------
			
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			StringWriter writer = new StringWriter();
			transformer.transform(new DOMSource(document), new StreamResult(writer));
			System.out.println(writer.toString());
			
			transformer.transform(new DOMSource(document), new StreamResult(new File("newXml.xml")));
			
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}
	}

}


四、使用DOM4j操作XML数据

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;

public class Test {

	public static void main(String[] args) {
		String xmlString = "<root><people>yelven</people></root>";
		
		try {
			Document document = DocumentHelper.parseText(xmlString);
			
			System.out.println(document.asXML());
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}

}