XML-mfy

定义:
可扩展标记语言,一种用于标记电子文档使其具有结果性的标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

xml和超文本标记语言区别:
html不一定需要成对出现,xml则一定需要成对出现; html 不区分大小写,但是xml区分。

格式良好的xml:
a)声明信息,用于描述xml的版本和编码方式。
<?xml version= "1.0" encoding= "UTF-8"?>p
b) xml 有且仅有-一个根元素。
c) xml 是大小写敏感的。
d)标签是成对的,而且要正确嵌套I
e)属性值要使用双引号。
f)注释的写法:

<?xml version="1.0" encoding="UTF-8"?>
<class>
  <className className="java.lang.Sting">
    <methodName>length</methodName>
  </className>
</class>

DTD简介
(1)DTD,Document Type Definition,文档类型定义.
(2)DTD用于约束xml的文档格式,保证xml是一个有效的xml.
(3)DTD可以分为两种,内部DTD,外部DTD.

使用内部DTD
(1)内部DTD的定义,语法如下:

(2)元素声明语法:
<!ELEMENT 元素名 (子元素[, 子元素...])>
(3)数量词
   >+:表示出现1次或多次,至少一次
   >?:表示出现0次或1次
   >*:表示出现任意次
(4)属性声明语法:
   >属性类型:CDATA,表示字符数据(character data)
   >默认值:
     - #REQUIRED ,表示必须出现
     - #IMPLIED,表示不是必须的

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

(5)带DTD的完整xml代码:

<?xml version="1.0" econding="UTF-8"?>
<!-- 声明内部DTD -->
<!DOCTYPE scores [
    <!ELEMENT scores (student+)>
    <!ELEMENT student (name,course,score)>
    <!ATTLIST student id CDATA #REQUIRED>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT course (#PCDATA)>
    <!ELEMENT score (#PCDATA)>
]>
<scores>
    <student id="1">
        <name>张三</name>
        <course>java</course>
        <score>89</score>
    </student>
    <student id="2">
        <name>李四</name>
        <course>sql</course>
        <score>69</score>
    </student>
</scores>

使用外部DTD
(1)创建一个独立的DTD文件:scores.dtd

<?xml version="1.0" econding="UTF-8"?>
 <!ELEMENT scores (student+)>
 <!ELEMENT student (name,course,score)>
 <!ATTLIST student id CDATA #REQUIRED>
 <!ELEMENT name (#PCDATA)>
 <!ELEMENT course (#PCDATA)>
 <!ELEMENT score (#PCDATA)>

(2)在xml中引入外部DTD文件

<!-- 引入外部DTD文件 -->
<!DOCTYPE scores SYSTEM "scores.dtd">

利用Java代码解析XML文档
使用 dom4j工具,读取、操作xml文件

import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * 使用 dom4j工具,读取、操作xml文件
 * 需要提前将工具jar包,添加到build path中
 */
public class ReadXMLDemo {
	public static void main(String[] args) throws DocumentException {
		//创建解析工具对象 org.dom4j.io.SAXReader
		SAXReader reader = new SAXReader();
		//读取emps.xml文件,解析生成树状结构的文档Document对象
		//	即,document对象中,包含了emps.xml文件中所有的内容
		Document document=reader.read(new File("Emps.xml"));
		
		System.out.println(document);
		//org.dom4j.tree.DefaultDocument@7229724f
		//[Document: name file:///D:/eclipse/workspace/xml/Emps.xml]
		
		//获得根元素
		Element rootEle = document.getRootElement();
		System.out.println("根元素:" + rootEle);
		//根元素:org.dom4j.tree.DefaultElement@4c873330 
		//[Element: <empList attributes: []/>]
		
		//获得子元素
		List<Element> list = rootEle.elements();
		for(Element ele:list) {
		System.out.println("子元素:" + ele);
		}
		//子元素:org.dom4j.tree.DefaultElement@41629346 [Element: <emp attributes: [org.dom4j.tree.DefaultAttribute@404b9385 [Attribute: name id value "2"]]/>]
		//子元素:org.dom4j.tree.DefaultElement@6d311334 [Element: <emp attributes: [org.dom4j.tree.DefaultAttribute@682a0b20 [Attribute: name id value "3"]]/>]
		//	子元素:org.dom4j.tree.DefaultElement@3d075dc0 [Element: <emp attributes: [org.dom4j.tree.DefaultAttribute@214c265e [Attribute: name id value "4"]]/>]
	}
}

遍历访问元素的属性、子元素、元素名

import java.io.File;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class ReadXMLDemo02 {
	public static void main(String[] args) throws DocumentException {
		
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("emps.xml"));
		Element rootEle = document.getRootElement();
		
		//获得所有的<emp>元素
		List<Element> list = rootEle.elements();
		//逐一遍历:<emp id = "1"><name>
		for(Element ele : list) {
			System.out.println("元素名:" + ele.getName());
			
			Attribute attr = ele.attribute("id");
			System.out.print(" 属性名: " + attr.getName());
			System.out.println(" 属性值:" + attr.getValue());
			
			Element nameEle = ele.element("name");	//获得指定名字的子元素
				//获得了:<name>张三</name>
			System.out.print(" 子元素名:" + nameEle.getName());
			System.out.println("子元素文本内容:" + nameEle.getText());	
			
			Element ageEle = ele.element("age");	//获得指定名字的子元素
			//获得了:<name>张三</name>
			System.out.print(" 子元素名:" + ageEle.getName());
			System.out.println("子元素文本内容:" + ageEle.getText());
		
			Element genderEle = ele.element("gender");	//获得指定名字的子元素
			//获得了:<name>张三</name>
			System.out.print(" 子元素名:" + genderEle.getName());
			System.out.println("子元素文本内容:" + genderEle.getText());
			
			Element salaryEle = ele.element("salary");	//获得指定名字的子元素
			//获得了:<name>张三</name>
			System.out.print(" 子元素名:" + salaryEle.getName());
			System.out.println("子元素文本内容:" + salaryEle.getText());
		}
	}
}

使用dom4j工具,写出一个新的xml文档
步骤:
1)创建一个空的Document文档对象(树状结构的)
2)添加一个根元素
3)向根元素中,添加子元素
4)合理地组织好树状结构
5)将Document对完,通过XMLWriter工具写出

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class WriteXMLDemo {
	public static void main(String[] args) throws IOException {
		List<Emp> list = new ArrayList<Emp>();
		list.add(new Emp(1,"小李", 12, "女", 12000));
		list.add(new Emp(2,"小孟", 13, "女", 13000));
		list.add(new Emp(3,"小张", 14, "男", 14000));
		list.add(new Emp(4,"小杨", 15, "男", 15000));
		
		//1)创建一个空的Document文档对象(树状结构的)
		Document document = DocumentHelper.createDocument();
		//2)添加一个根元素
		Element rootEle = document.addElement("empList");
			//注意,向document对象中添加元素的工作,只能做一次!根元素就一个!
				//document对象中的信息:
				//<?xml version="1.0" encoding="UTF-8"?>
				//<empList/>
		//向根元素中,添加<emp>元素,将返回这个元素对象
		//3)向根元素中,添加子元素
		for(Emp emp : list) {
		//	emp = new Emp();
			Element empEle = rootEle.addElement("emp");//传入子元素的标签名
			//向<emp>元素中,添加员工成员变量信息的子元素
			empEle.addAttribute("id", emp.getId() + "");
			Element nameEle = empEle.addElement("name");
			nameEle.addText(emp.getName());
			//使用链式写法,添加子元素及文本内容
			empEle.addElement("age").addText(emp.getAge() + "");
			empEle.addElement("gender").addText(emp.getGender());
			empEle.addElement("salary").addText(emp.getSalary() + "");//传入格式化工具
		}
		
		//4)合理地组织好树状结构
		System.out.println("document对象中的信息:");
		System.out.println(document.asXML());
		
		//5)将Document对完,通过XMLWriter工具写出
		FileOutputStream fos = new FileOutputStream("emps-new.xml");
		OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
		OutputFormat format = OutputFormat.createPrettyPrint();
								//创建一个美观的格式化工具
		XMLWriter xmlWriter = new XMLWriter(osw, format);//传入格式化工具
		xmlWriter.write(document);//写出xml文档
		xmlWriter.close();
	}
}

xpath检索

import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XPathDemo {
	public static void main(String[] args) throws DocumentException {
		//1.将xml文档读入,转换为Document文档对象
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read(new File("books.xml"));
		
		//手工检索,需要写大量代码
		//Element rootEle = document.getRootElement();
		//Element ele = rootEle.elementByID("1");//null
		//System.out.println(ele);
		
		//2.使用XPath工具检索内容
		String xpath = "//book[@id='1']";//获得id为1的book元素
		
		//绝对路径形式检索
		xpath = "/bookstore/book";
				//以绝对路径的形式,查找所有元素;<bookstore>元素下所有的<book>元素
		xpath = "/bookstore/book/title";//获得四个<title>元素
		xpath = "/bookstore/book/*";//获得每个<book>元素中所有的内容
		
		//没有/时,表示在当前节点上选择检索
		xpath = "book";//没有匹配的元素,集合是空的;当前节点中没有book元素
		xpath = ".";	//表示选取当前节点
					//测试的代码document.selectNodes("."),因此当前节点是document
		xpath = "bookstore";		//可以获得<bookstore>节点元素
		
		//从当前节点中检索所有匹配的元素,且不考虑位置
		xpath = "//book";//查找到所有<book>元素节点
		xpath = "//title";//查找到所有<title>元素节点
		
		//
		xpath = "//@lang";//获得所有的语种
		xpath = "//@category";//获得所有的类别
		
		//使用谓语,添加筛选条件
		xpath = "//book[1]";//获取符合检索条件的第一个元素
		xpath = "//book[last()]";//使用last()函数,定位到最后一个元素
		xpath = "//book[last()-1]";//使用last()-1函数,定位到倒数第二个个元素
		xpath = "//book[position()<3]";//获得前两个元素,下标从1开始计数
		
		//使用谓语,结合元素的属性,增加筛选条件
		xpath = "//book[@id]";		//查找所有的书,并且带有id属性
		xpath = "//book[@id='2']";		//查找id为2的书
		
		//使用谓语,结合元素的子元素,增加筛选条件
		xpath = "//book[price>35]";//查找价格大于35元的书
		xpath = "//book[price>35]/title";//查找价格大于35元的书 的标题
		
		xpath = "//title[@*]";//查找出带有属性的<title>
		
		System.out.println("使用" + xpath + "进行xpath检索,得到的结果是:");
		List list = document.selectNodes(xpath);
		for(Object obj : list) {
			System.out.println("获得的节点是:");
			System.out.println(obj);
			
			System.out.println("XML形式:");
			Element ele = (Element)obj;
			System.out.println(ele.asXML());
		}
		//org.dom4j.tree.DefaultElement@6bf2d08e [Element: 
		//<book attributes: [org.dom4j.tree.DefaultAttribute
		//@48cf768c [Attribute: name category value "COOKING"]]/>
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值