XML详解
XML详解1、XML简介XML在当今的编程世界中无处不在。从Struts、Hiberbate、Spring的各种配置文件到Ajax中的数据交换、再到WebService的推行、SOA理念的应用都离不开XML。
2、XML用途存储数据、分离数据、交换数据、共享数据。
3、XML语法一个XML文件分为如下几部分内容: 文档声明 、标签、属性、注释、转义字符、CDATA区 、处理指令 在编写XML文档时,需要先使用文档声明,声明XML文档的类型。
最简单的声明语法:
<?xml version="1.0" ?>用encoding属性说明文档的字符编码:
<?xml version="1.0" encoding="GB2312" ?>用standalone属性说明文档是否独立:
<?xml version="1.0" encoding="GB2312" standalone="yes" ?> 标签: 一个标签有如下几种书写形式,例如: 包含标签体:<a>husheng</a>
元素: 对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。
属性: 一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:
<input name=“husheng”> 注释: Xml文件中的注释采用:“<!--注释-->” 格式。
转义字符: 对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理。
CDATA区: 在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。
处理指令: 处理指令,简称PI。处理指令用来指挥解析引擎如何解析XML文档内容。例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。
<?xml-stylesheet type="text/css" href="1.css"?> 4、DOM解析XML文件DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点。
下面我们通过编程来读取XML文件: 1、导包。 2、创建一个xml解析器对象。 3、读取xml文档,返回Document对象。
package cn.eud.hust.husheng; import java.io.File; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; public class dom4j { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub SAXReader reader = new SAXReader(); try { Document doc = reader.read(new File("list.xml")); System.out.println(doc); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }结果如下:
下面让我们来操作这个文件。
package cn.eud.hust.husheng; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class dom4j { /** * @param args */ public static void main(String[] args) { List<student> list = new ArrayList<student>(); // TODO Auto-generated method stub SAXReader reader = new SAXReader(); try { Document doc = reader.read(new File("list.xml")); System.out.println(doc); Iterator<Element> it = doc.getRootElement().elementIterator("people"); while(it.hasNext()){ Element elem = it.next(); //创建Contact student stu = new student(); stu.setId(elem.attributeValue("id")); stu.setName(elem.elementText("name")); stu.setAge(elem.elementText("age")); list.add(stu); } } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } for (student stu : list) { System.out.println(stu.getName()+"+"+stu.getId()+"+"+stu.getAge()); } } }
package cn.eud.hust.husheng; import java.io.File; import java.io.FileOutputStream; import java.io.UnsupportedEncodingException; import org.dom4j.Attribute; import org.dom4j.Document; 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 test { @Test public void testFunction() throws Exception{ dom4j re = new dom4j(); Document doc = new SAXReader().read(new File("list.xml")); Element Ele1 = doc.getRootElement().element("people"); Attribute Att = Ele1.attribute("id"); Ele1.addAttribute("id","3"); //修改id成3 WriteOutXML(doc); re.main(null); Att.setValue("4"); //修改id成4 WriteOutXML(doc); re.main(null); Element ageElem = doc.getRootElement().element("people").element("age"); ageElem.detach(); //刪除标签 WriteOutXML(doc); re.main(null); Ele1.addElement("qq").setText("1258164851"); //修改名字 WriteOutXML(doc); re.main(null); } public void WriteOutXML(Document doc) throws Exception { FileOutputStream out = new FileOutputStream("list.xml"); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("utf-8"); XMLWriter writer = new XMLWriter(out,format); writer.write(doc); writer.close(); } } 修改后的xml文件:
<?xml version="1.0" encoding="utf-8"?> <list> <people id="4"> <name>husheng</name> <qq>1258164851</qq> </people> <people id="2"> <name>wangpeng</name> <age>22</age> </people> </list>
5、SAX解析XML文件SAX 解析器在解析开始的时候就开始发送事件。当解析器发现文档开始、元素开始和文本等时,代码会收到一个事件。
package cn.eud.hust.husheng; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * */ public class MyDefaultHandler extends DefaultHandler { /** * 开始文档时调用 */ @Override public void startDocument() throws SAXException { System.out.println("MyDefaultHandler.startDocument()"); } /** * 开始标签时调用 * @param qName: 表示开始标签的标签名 * @param attributes: 表示开始标签内包含的属性列表 */ @Override public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException { System.out.println("MyDefaultHandler.startElement()-->"+qName); } /** * 结束标签时调用 * @param qName: 结束标签的标签名称 */ @Override public void endElement(String uri,String qName) throws SAXException { System.out.println("MyDefaultHandler.endElement()-->"+qName); } /** * 读到文本内容的时调用 * @param ch: 表示当前读完的所有文本内容 * @param start: 表示当前文本内容的开始位置 * @param length: 表示当前文本内容的长度 */ @Override public void characters(char[] ch,int start,int length) throws SAXException { //得到当前文本内容 String content = new String(ch,start,length); System.out.println("MyDefaultHandler.characters()-->"+content); } /** * 结束文档时调用 */ @Override public void endDocument() throws SAXException { System.out.println("MyDefaultHandler.endDocument()"); } } package cn.eud.hust.husheng; import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class Demo { public static void main(String[] args) throws Exception{ //1.创建SAXParser对象 SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); //2.调用parse方法 parser.parse(new File("list.xml"),new MyDefaultHandler()); } } package cn.eud.hust.husheng; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * SAX处理器程序 */ public class MyDefaultHandler2 extends DefaultHandler { //存储xml文档信息 private StringBuffer sb = new StringBuffer(); //获取xml信息 public String getContent(){ return sb.toString(); } /** * 开始标签 */ @Override public void startElement(String uri,Attributes attributes) throws SAXException { sb.append("<"+qName); //判断是否有属性 if(attributes!=null){ for(int i=0;i<attributes.getLength();i++){ //得到属性名称 String attrName = attributes.getQName(i); //得到属性值 String attrValue = attributes.getValue(i); sb.append(" "+attrName+"=""+attrValue+"""); } } sb.append(">"); } /** * 文本内容 */ @Override public void characters(char[] ch,int length) throws SAXException { //得到当前读取的文本 String content = new String(ch,length); sb.append(content); } /** * 结束标签 */ @Override public void endElement(String uri,String qName) throws SAXException { sb.append("</"+qName+">"); } } package cn.eud.hust.husheng; import java.io.File; import cn.eud.hust.husheng.*; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class Demo { public static void main(String[] args)throws Exception { //1.创建SAXParser SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); //2.读取xml文件 MyDefaultHandler2 handler = new MyDefaultHandler2(); parser.parse(new File("list.xml"),handler); String content = handler.getContent(); System.out.println(content); } } 6、xPath技术
import java.io.File; import java.io.FileOutputStream; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class Demo { public static void main(String[] args) throws Exception{ Document doc = new SAXReader().read(new File("e:/student.xml")); //1.查询id为2的学生标签 //使用xpath技术 Element stuElem = (Element)doc.selectSingleNode("//Student[@id='2']"); //2.删除标签 stuElem.detach(); //3.写出xml文件 FileOutputStream out = new FileOutputStream("e:/student.xml"); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("utf-8"); XMLWriter writer = new XMLWriter(out,format); writer.write(doc); writer.close(); } } import java.io.File; import java.util.List; import org.dom4j.Document; import org.dom4j.Node; import org.dom4j.io.SAXReader; public class Demo2 { public static void main(String[] args) throws Exception { Document doc = new SAXReader().read(new File("./src/contact.xml")); String xpath = ""; /** * 1.绝对路径 表示从xml的根位置开始或子元素(一个层次结构) */ xpath = "/contactList"; xpath = "/contactList/contact"; /** * 2.相对路径 表示不分任何层次结构的选择元素。 */ xpath = "//contact/name"; xpath = "//name"; /** * 通配符 表示匹配所有元素 */ xpath = "/contactList/*"; //根标签contactList下的所有子标签 xpath = "/contactList//*";//根标签contactList下的所有标签(不分层次结构) /** *条件 表示选择什么条件下的元素 */ //带有id属性的contact标签 xpath = "//contact[@id]"; //第二个的contact标签 xpath = "//contact[2]"; //选择最后一个contact标签 xpath = "//contact[last()]"; /** *属性 表示选择属性节点 */ xpath = "//@id"; //选择id属性节点对象,返回的是Attribute对象 xpath = "//contact[not(@id)]";//选择不包含id属性的contact标签节点 xpath = "//contact[@id='002']";//选择id属性值为002的contact标签 xpath = "//contact[@id='001' and @name='eric']";//选择id属性值为001,且name属性为eric的contact标签 /** *表示选择文本内容 */ //选择name标签下的文本内容,返回Text对象 xpath = "//name/text()"; xpath = "//contact/name[text()='张三']";//选择姓名为张三的name标签 List<Node> list = doc.selectNodes(xpath); for (Node node : list) { System.out.println(node); } } }
结束。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 董淳光 SQLITE3 使用总结(1)
- ruby-on-rails – 使用绝对路径启动Rails服务器
- .net – 如何使用Unity DI加载具有依赖项的程序集,然后注册
- NetBeans可以用来编写Objective-C程序吗?
- 如何在反应原生中重叠
- cocos2dx[3.2](18)――屏幕截图ScreenShot
- Quick cocos2dx-Lua(V3.3R1)学习笔记(7) ---计时器,我是
- ruby-on-rails-3 – Rails 3.2 HTML5多文件上传,Carrierwav
- 防止SQLite Magellan破坏您的应用程序
- reactjs – React.js – ForEach作为一流的组件?