标签:
一.HTML和XML的区别之处
HTML HyperTextMarkupLanguage 超文本标记语言,由w3c组织规定,约100多个标签,用于规定网页结构。
XML ExtendMarkupLanguage 可扩展标记语言,标签由开发者自定义
作用
-描述带关系的数据,作为软件的配置文件,包含与被包含的关系
例如:使用ip(255.43.12.54)地址和端口(1521),连接oracle数据库,保存学生数据。
把ip地址端口配置到xml文件:
host.xml
<host> <ip>255.43.12.55</ip> <port>1521</port> </host>
-作为数据的载体,用于存储数据,是一个小型的“数据库”
例如
教师信息管理系统存储教师的信息
teacher.xml <teacher> <name>张三</name> <email>zhangsan@qq.com</email> <workage>2</workage> </teacher>
二.XML语法
1.标签
1> <eleName></eleName> 标签体内有内容
</eleName> 标签体内没有内容
2> xml 标签名称区分大小写
3> xml标签一定要正确配对
4> xml标签名中间不能有空格
5> xml标签名不能以数字开头
6> 在一个xml文档中有且仅有一个根标签
2.
语法 <elemName name="cxspace"></elemName>
注意事项:
-属性值必须1以引号包含,不能省略,也不能单双引号混合使用
-一个标签可以有多个属性,单数不能出现重复的属性名
3.注释
<!--注释内容-->
4.文档声明
语法:<?xml version="1.0" encoding="utf-8">
version:xml版本号
encoding:解析xml文件时查询的码表
注意
1)如果在eclipse或者idea工具中开发xml文件,保存xml文件时自动按照文档声明的encoding来保存
2)用记事本工具修改xml文件,注意保存xml文件按照文档声明的encoding的码表来保存
5.转义字符
xml中内置了一些特殊字符,这些字符不能直接被浏览器原样输出。如果希望把这些特殊字符按照原样输出到浏览器,需要对这些特殊字符进行转义
特殊字符 转义字符 < < > > " " & & 空格 &nsbp;
6.CDATA块
可以让一些需要进行包含特殊字符的内容哦给统一原样输出
7.处理指令
告诉xml解析器如何解析xml文档
三.XML解析
DOM解析
DOM解析原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建出一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问到xml文档中的内容.
Dom4j解析工具解析步骤
1 > 导入 dom4j-1.6.1.jar 核心包
2 > 编写Dom4j读取xml文件代码
public static void main(String[] args) { try { //1.创建一个xml解析器对象 SAXReader reader = new SAXReader(); //2.读取xml文档,返回Document对象 Document doc = reader.read(new File("./src/student.xml")); System.out.println(doc); } catch (DocumentException e) { e.printStackTrace(); throw new RuntimeException(e); } }
上述代码可以读取src下的student.xml进内存,返回文档树对象.
Dom4j包中读取xml文件内容的API
节点:
Iterator Element.nodeIterator(); //获取当前标签节点下的所有子节点
标签:
Element Document.getRootElement(); //获取xml文档的根标签
Element ELement.element("标签名") //指定名称的第一个子标签
Iterator<Element> Element.elementIterator("标签名");// 指定名称的所有子标签
List<Element> Element.elements(); //获取所有子标签
属性:
String Element.attributeValue("属性名") //获取指定名称的属性值
Attribute Element.attribute("属性名");//获取指定名称的属性对象
Attribute.getName() //获取属性名称
Attibute.getValue() //获取属性值
List<Attribute> Element.attributes(); //获取所有属性对象
Iterator<Attribute> Element.attibuteIterator(); //获取所有属性对象
文本:
Element.getText(); //获取当前标签的文本
Element.elementText("标签名") //获取当前标签的指定名称的子标签的文本内容
实例代码
contact.xml
<?xml version="1.0" encoding="utf-8"?> <contactList> <contact id="001"> <name>张三</name> <age>20</age> <phone>134222223333</phone> <email>zhangsan@qq.com</email> <qq>432221111</qq> </contact> <contact id="002"> <name>李四</name> <age>20</age> <phone>134222225555</phone> <email>lisi@qq.com</email> <qq>432222222</qq> </contact> </contactList>
entity实体类
package gz.itcast.a_dom4j_read; public class Contact { private String id; private String name; private String age; private String phone; private String email; private String qq; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getQq() { return qq; } public void setQq(String qq) { this.qq = qq; } @Override public String toString() { return "Contact [age=" + age + ", email=" + email + ", id=" + id + ", name=" + name + ", phone=" + phone + ", qq=" + qq + "]"; } }
调用api的demo
package gz.itcast.a_dom4j_read; import java.io.File; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; /** * 第一个Dom4j读取xml文档的例子 * @author APPle * */ public class Demo1 { public static void main(String[] args) { try { //1.创建一个xml解析器对象 SAXReader reader = new SAXReader(); //2.读取xml文档,返回Document对象 Document doc = reader.read(new File("./src/contact.xml")); System.out.println(doc); } catch (DocumentException e) { e.printStackTrace(); throw new RuntimeException(e); } } }
package gz.itcast.a_dom4j_read; import java.io.File; import java.util.Iterator; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader; import org.junit.Test; /** * 第二个dom4j读取xml文件内容 * 节点 * 标签 * 属性 * 文本 * @author APPle * */ public class Demo2 { /** * 得到节点信息 */ @Test public void test1() throws Exception{ //1.读取xml文档,返回Document对象 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/contact.xml")); //2.nodeIterator: 得到当前节点下的所有子节点对象(不包含孙以下的节点) Iterator<Node> it = doc.nodeIterator(); while(it.hasNext()){//判断是否有下一个元素 Node node = it.next();//取出元素 String name = node.getName();//得到节点名称 //System.out.println(name); //System.out.println(node.getClass()); //继续取出其下面的子节点 //只有标签节点才有子节点 //判断当前节点是否是标签节点 if(node instanceof Element){ Element elem = (Element)node; Iterator<Node> it2 = elem.nodeIterator(); while(it2.hasNext()){ Node n2 = it2.next(); System.out.println(n2.getName()); } } } } /** * 遍历xml文档的所有节点 * @throws Exception */ @Test public void test2() throws Exception{ //1.读取xml文档,返回Document对象 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/contact.xml")); //得到根标签 Element rooElem = doc.getRootElement(); getChildNodes(rooElem); } /** * 获取 传入的标签下的所有子节点 * @param elem */ private void getChildNodes(Element elem){ System.out.println(elem.getName()); //得到子节点 Iterator<Node> it = elem.nodeIterator(); while(it.hasNext()){ Node node = it.next(); //1.判断是否是标签节点 if(node instanceof Element){ Element el = (Element)node; //递归 getChildNodes(el); } }; } /** * 获取标签 */ @Test public void test3() throws Exception{ //1.读取xml文档,返回Document对象 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/contact.xml")); //2.得到根标签 Element rootElem = doc.getRootElement(); //得到标签名称 String name = rootElem.getName(); System.out.println(name); //3.得到当前标签下指定名称的第一个子标签 /* Element contactElem = rootElem.element("contact"); System.out.println(contactElem.getName()); */ //4.得到当前标签下指定名称的所有子标签 /* Iterator<Element> it = rootElem.elementIterator("contact"); while(it.hasNext()){ Element elem = it.next(); System.out.println(elem.getName()); } */ //5.得到当前标签下的的所有子标签 List<Element> list = rootElem.elements(); //遍历List的方法 //1)传统for循环 2)增强for循环 3)迭代器 /*for(int i=0;i<list.size();i++){ Element e = list.get(i); System.out.println(e.getName()); }*/ /* for(Element e:list){ System.out.println(e.getName()); }*/ /* Iterator<Element> it = list.iterator(); //ctrl+2 松开 l while(it.hasNext()){ Element elem = it.next(); System.out.println(elem.getName()); }*/ //获取更深层次的标签(方法只能一层层地获取) Element nameElem = doc.getRootElement(). element("contact").element("name"); System.out.println(nameElem.getName()); } /** * 获取属性 */ @Test public void test4() throws Exception{ //1.读取xml文档,返回Document对象 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/contact.xml")); //获取属性:(先获的属性所在的标签对象,然后才能获取属性) //1.得到标签对象 Element contactElem = doc.getRootElement().element("contact"); //2.得到属性 //2.1 得到指定名称的属性值 /* String idValue = contactElem.attributeValue("id"); System.out.println(idValue); */ //2.2 得到指定属性名称的属性对象 /*Attribute idAttr = contactElem.attribute("id"); //getName: 属性名称 getValue:属性值 System.out.println(idAttr.getName() +"=" + idAttr.getValue());*/ //2.3 得到所有属性对象,返回LIst集合 /*List<Attribute> list = contactElem.attributes(); //遍历属性 for (Attribute attr : list) { System.out.println(attr.getName()+"="+attr.getValue()); }*/ //2.4 得到所有属性对象,返回迭代器 Iterator<Attribute> it = contactElem.attributeIterator(); while(it.hasNext()){ Attribute attr = it.next(); System.out.println(attr.getName()+"="+attr.getValue()); } } /** * 获取文本 */ @Test public void test5() throws Exception{ //1.读取xml文档,返回Document对象 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/contact.xml")); /** * 注意: 空格和换行也是xml的内容 */ String content = doc.getRootElement().getText(); System.out.println(content); //获取文本(先获取标签,再获取标签上的文本) Element nameELem = doc.getRootElement().element("contact").element("name"); //1. 得到文本 String text = nameELem.getText(); System.out.println(text); //2. 得到指定子标签名的文本内容 String text2 = doc.getRootElement().element("contact").elementText("phone"); System.out.println(text2); } }
迭代遍历
package gz.itcast.a_dom4j_read; import java.io.File; import java.util.Iterator; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.Text; import org.dom4j.io.SAXReader; import org.junit.Test; /** * 练习-完整读取xml文档内容 * @author APPle * */ public class Demo3 { @Test public void test() throws Exception{ //读取xml文档 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/contact.xml")); //读取根标签 Element rootELem = doc.getRootElement(); StringBuffer sb = new StringBuffer(); getChildNodes(rootELem,sb); System.out.println(sb.toString()); } /** * 获取当前标签的所有子标签 */ private void getChildNodes(Element elem,StringBuffer sb){ //System.out.println(elem.getName()); //开始标签 sb.append("<"+elem.getName()); //得到标签的属性列表 List<Attribute> attrs = elem.attributes(); if(attrs!=null){ for (Attribute attr : attrs) { //System.out.println(attr.getName()+"="+attr.getValue()); sb.append(" "+attr.getName()+"=\""+attr.getValue()+"\""); } } sb.append(">"); //得到文本 //String content = elem.getText(); //System.out.println(content); Iterator<Node> it = elem.nodeIterator(); while(it.hasNext()){ Node node = it.next(); //标签 if(node instanceof Element){ Element el = (Element)node; getChildNodes(el,sb); } //文本 if(node instanceof Text){ Text text = (Text)node; sb.append(text.getText()); } } //结束标签 sb.append("</"+elem.getName()+">"); } }
知识点list集合使用,list集合遍历
package gz.itcast.a_dom4j_read; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * 把xml文档信息封装到对象中 * @author APPle * */ public class Demo4 { public static void main(String[] args) throws Exception{ List<Contact> list = new ArrayList<Contact>(); //读取xml,封装对象 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/contact.xml")); //读取contact标签 Iterator<Element> it = doc.getRootElement().elementIterator("contact"); while(it.hasNext()){ Element elem = it.next(); //创建Contact Contact contact = new Contact(); contact.setId(elem.attributeValue("id")); contact.setName(elem.elementText("name")); contact.setAge(elem.elementText("age")); contact.setPhone(elem.elementText("phone")); contact.setEmail(elem.elementText("email")); contact.setQq(elem.elementText("qq")); list.add(contact); } for (Contact contact : list) { System.out.println(contact); } } }
Dom4j中修改xml文档的api
XMLWriter writer = new XMLWriter(OutputStream, OutputForamt)
wirter.write(Document);
修改xml文档的API
增加:
DocumentHelper.createDocument() 增加文档
addElement("名称") 增加标签
addAttribute("名称",“值”) 增加属性
修改:
Attribute.setValue("值") 修改属性值
Element.addAtribute("同名的属性名","值") 修改同名的属性值
Element.setText("内容") 修改文本内容
删除
Element.detach(); 删除标签
Attribute.detach(); 删除属性
实例demo
package gz.itcast.a_dom4j_write; import java.io.File; import java.io.FileOutputStream; import org.dom4j.Document; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; /** * 第一个写出内容到xml文档 * @author APPle * */ public class Demo1 { public static void main(String[] args) throws Exception{ //一、读取或创建一个Document对象 //读取day07项目的xm文件 Document doc = new SAXReader().read(new File("./src/contact.xml")); //二、修改Document对象内容 //三、把修改后的Document对象写出到xml文档中 //指定文件输出的位置 FileOutputStream out = new FileOutputStream("e:/contact.xml"); //1.创建写出对象 XMLWriter writer = new XMLWriter(out); //2.写出对象 writer.write(doc); //3.关闭流 writer.close(); } }
package gz.itcast.a_dom4j_write; import java.io.File; import java.io.FileOutputStream; import org.dom4j.Document; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; /** * 讨论写出内容到xml文档的细节 * @author APPle * */ public class Demo2 { /** * @param args */ public static void main(String[] args) throws Exception{ Document doc = new SAXReader().read(new File("./src/contact.xml")); //指定文件输出的位置 FileOutputStream out = new FileOutputStream("e:/contact.xml"); /** * 1.指定写出的格式 */ OutputFormat format = OutputFormat.createCompactFormat(); //紧凑的格式.去除空格换行.项目上线的时候 //OutputFormat format = OutputFormat.createPrettyPrint(); //漂亮的格式.有空格和换行.开发调试的时候 /** * 2.指定生成的xml文档的编码 * 同时影响了xml文档保存时的编码 和 xml文档声明的encoding的编码(xml解析时的编码) * 结论: 使用该方法生成的xml文档避免中文乱码问题。 */ format.setEncoding("utf-8"); //1.创建写出对象 XMLWriter writer = new XMLWriter(out,format); //2.写出对象 writer.write(doc); //3.关闭流 writer.close(); } }
package gz.itcast.a_dom4j_write; import java.io.File; import java.io.FileOutputStream; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; /** * 修改xml内容 * 增加:文档,标签 ,属性 * 修改:属性值,文本 * 删除:标签,属性 * @author APPle * */ public class Demo3 { /** * 增加:文档,标签 ,属性 */ @Test public void test1() throws Exception{ /** * 1.创建文档 */ Document doc = DocumentHelper.createDocument(); /** * 2.增加标签 */ Element rootElem = doc.addElement("contactList"); //doc.addElement("contactList"); Element contactElem = rootElem.addElement("contact"); contactElem.addElement("name"); /** * 3.增加属性 */ contactElem.addAttribute("id", "001"); contactElem.addAttribute("name", "eric"); //把修改后的Document对象写出到xml文档中 FileOutputStream out = new FileOutputStream("e:/contact.xml"); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("utf-8"); XMLWriter writer = new XMLWriter(out,format); writer.write(doc); writer.close(); } /** * 修改:属性值,文本 * @throws Exception */ @Test public void test2() throws Exception{ Document doc = new SAXReader().read(new File("./src/contact.xml")); /** * 方案一: 修改属性值 1.得到标签对象 2.得到属性对象 3.修改属性值 */ //1.1 得到标签对象 /* Element contactElem = doc.getRootElement().element("contact"); //1.2 得到属性对象 Attribute idAttr = contactElem.attribute("id"); //1.3 修改属性值 idAttr.setValue("003"); */ /** * 方案二: 修改属性值 */ //1.1 得到标签对象 /* Element contactElem = doc.getRootElement().element("contact"); //1.2 通过增加同名属性的方法,修改属性值 contactElem.addAttribute("id", "004"); */ /** * 修改文本 1.得到标签对象 2.修改文本 */ Element nameElem = doc.getRootElement(). element("contact").element("name"); nameElem.setText("李四"); FileOutputStream out = new FileOutputStream("e:/contact.xml"); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("utf-8"); XMLWriter writer = new XMLWriter(out,format); writer.write(doc); writer.close(); } /** * 删除:标签,属性 * @throws Exception */ @Test public void test3() throws Exception{ Document doc = new SAXReader().read(new File("./src/contact.xml")); /** * 1.删除标签 1.1 得到标签对象 1.2 删除标签对象 */ // 1.1 得到标签对象 /* Element ageElem = doc.getRootElement().element("contact") .element("age"); //1.2 删除标签对象 ageElem.detach(); //ageElem.getParent().remove(ageElem); */ /** * 2.删除属性 2.1得到属性对象 2.2 删除属性 */ //2.1得到属性对象 //得到第二个contact标签 Element contactElem = (Element)doc.getRootElement(). elements().get(1); //2.2 得到属性对象 Attribute idAttr = contactElem.attribute("id"); //2.3 删除属性 idAttr.detach(); //idAttr.getParent().remove(idAttr); FileOutputStream out = new FileOutputStream("e:/contact.xml"); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("utf-8"); XMLWriter writer = new XMLWriter(out,format); writer.write(doc); writer.close(); } }
package gz.itcast.a_dom4j_write; import java.io.File; import java.io.FileOutputStream; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; /** * 课堂练习: * 1.使用dom4j的api来生成以下的xml文件 <Students> <Student id="1"> <name>张三</name> <gender>男</gender> <grade>计算机1班</grade> <address>广州天河</address> </Student> <Student id="2"> <name>李四</name> <gender>女</gender> <grade>计算机2班</grade> <address>广州越秀</address> </Student> </Students> 2.修改id为2的学生的姓名,改为“王丽” 3.删除id为2的学生 * @author APPle * */ public class Demo4 { /** * 1.生成指定xml文档 * @throws Exception */ @Test public void test1() throws Exception{ //1.内存创建xml文档 Document doc = DocumentHelper.createDocument(); //2.写入内容 Element rootElem = doc.addElement("Students"); //2.1 增加标签 Element studentElem1 = rootElem.addElement("Student"); //2.2 增加属性 studentElem1.addAttribute("id", "1"); //2.3 增加标签,同时设置文本 studentElem1.addElement("name").setText("张三"); studentElem1.addElement("gender").setText("男"); studentElem1.addElement("grade").setText("计算机1班"); studentElem1.addElement("address").setText("广州天河"); //2.1 增加标签 Element studentElem2 = rootElem.addElement("Student"); //2.2 增加属性 studentElem2.addAttribute("id", "2"); //2.3 增加标签,同时设置文本 studentElem2.addElement("name").setText("李四"); studentElem2.addElement("gender").setText("女"); studentElem2.addElement("grade").setText("计算机2班"); studentElem2.addElement("address").setText("广州越秀"); //3.内容写出到xml文件 //3.1 输出位置 FileOutputStream out = new FileOutputStream("e:/student.xml"); //3.2 指定格式 OutputFormat format = OutputFormat.createPrettyPrint(); // 设置编码 format.setEncoding("utf-8"); XMLWriter writer = new XMLWriter(out,format); //3.3 写出内容 writer.write(doc); //3.4关闭资源 writer.close(); } /** * 2.修改id为2的学生姓名 * @throws Exception */ @Test public void test2() throws Exception{ //1.查询到id为2的学生 Document doc = new SAXReader().read(new File("e:/student.xml")); //1.1 找到所有的Student标签 Iterator<Element> it = doc.getRootElement().elementIterator("Student"); while(it.hasNext()){ Element stuElem = it.next(); //1.2 查询id为id的学生标签 if(stuElem.attributeValue("id").equals("2")){ stuElem.element("name").setText("王丽"); break; } } //3.1 输出位置 FileOutputStream out = new FileOutputStream("e:/student.xml"); //3.2 指定格式 OutputFormat format = OutputFormat.createPrettyPrint(); // 设置编码 format.setEncoding("utf-8"); XMLWriter writer = new XMLWriter(out,format); //3.3 写出内容 writer.write(doc); //3.4关闭资源 writer.close(); } /** * 3.删除id为2的学生 * @throws Exception */ @Test public void test3() throws Exception{ //1.查询到id为2的学生 Document doc = new SAXReader().read(new File("e:/student.xml")); //1.1 找到所有的Student标签 Iterator<Element> it = doc.getRootElement().elementIterator("Student"); while(it.hasNext()){ Element stuElem = it.next(); //1.2 查询id为id的学生标签 if(stuElem.attributeValue("id").equals("2")){ //1.3 删除该学生标签 stuElem.detach(); break; } } //3.1 输出位置 FileOutputStream out = new FileOutputStream("e:/student.xml"); //3.2 指定格式 OutputFormat format = OutputFormat.createPrettyPrint(); // 设置编码 format.setEncoding("utf-8"); XMLWriter writer = new XMLWriter(out,format); //3.3 写出内容 writer.write(doc); //3.4关闭资源 writer.close(); } }
标签:
原文地址:http://www.cnblogs.com/cxspace/p/5768392.html