2.XML:Extensible Markup Language可扩展标记语言

来源:互联网 发布:工商管理网络课程 编辑:程序博客网 时间:2024/06/05 10:03

1.XML出现的根本目标:描述在显示生活中有关系的数据

2.应用:  (1)保存有关系的数据 (2)软件配置文件,描述程序模块间关系

一:语法:

1.文档声明

<?xml version="1.0"  encoding="utf-8" standalone="no"?>

standalone用来说明文档是否独立

2.元素:XML元素是指XML文件中出现的标签,一个标签分为开始标签和结束标签

3.属性:<input name = "text'> 属性值一定要用单引号或双引号

4.注释:<!--注释-->

5.CDATA区:不想让解析引擎执行的内容可以放在CDATA区域,XML将原封不动的输出

语法:<![CDATA[内容]]>

6.转义字符 

&   &amp;<  &lt;       >   &gt;

"    &quot;'   &apos



二:约束

1.什么是XML约束:在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束

2.常用的XML约束技术 (1)XML DTD         (2) XML Schema

3.DTD约束:文档类型定义           PCDATA-- 字符数据

        <!ELEMENT 书架 (书+) >

<!ELEMENT 书 (书名,作者,售价) >

<!ELEMENT 书名 (#PCDATA)>

<!ELEMENT 作者 (#PCDATA)>

<!ELEMENT 售价 (#PCDATA)>

DTD校验:使用Eclips校验

 (1)引用DTD约束

XML文件使用DOCTYPE声明语句来指明它所遵循的DTD文件,DOCTYPE声明语句有两种形式:

*当引用的文件在本地时,<!DOCTYPE 文档根节点 SYSTEM "book.dtd">

*当引用文件时一个公共的文件,<!DOCTYPE 文档根节点 PUBLIC "DTD名称" "DTD文件的URL">

 (2)元素定义

<!ELEMENT 元素名称 元素类型>

元素类型可以是元素内容或类型,如果为元素的内容,则要用()括起来

  <!ELEMENT 书架 ANY > 任意类型

括号内的元素逗号分割,表示内容出现顺序必须与声明时一致

用 | 分割,表示多个只能出现一个

+:一次或多次(书+)

?:0次或一次(书?)

*:0次或多次(书*)

(书)书必须出现一次

(3)属性定义

<!ATTLIST 页面作者

姓名 CDATA #IMPLIED

年龄 CDATA #FIXED

联系信息 CDATA #REQUIRED

>

#REQUIRED 必须设置该属性

#IMPLIED 可以设置也可以不设置

#FIXED说明该属性的取值固定为一个值


(3)实体定义

实体分为 引用实体和参数实体

引用实体主要在XML我能当中被应用

语法格式:<!ENTITY 实体名称 "实体内容">

引用方式:&实体名称


参数实体被DTD文件自身使用

语法格式:<!ENTITY %实体名称 "实体内容">

医用方式:%实体名称


三.XML解析------DOM和SAX

DOM和SAX解析方式的区别?

1.DOM解析的优点是对文档crub(创建读更新删除)比较方便,缺点是占用内存比较大

2.SAX解析的优点是占用内存少,解析速度快,缺点是只适合做文档的读取,不适合做文档的crud

XML解析开发包Jaxp(sun) Jdom dom4j


使用JAXP对XML文档进行DOM解析

import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;public class T1 {public static void main(String[] args) throws Exception {//1.得到某个标签的值//创建工厂DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();//得到DOM解析器DocumentBuilder bui = fac.newDocumentBuilder();//解析XML文档,得到代表文档的documentDocument doc = bui.parse("src/NewFile.xml");NodeList list = doc.getElementsByTagName("a1");Node node1 = list.item(0);String content = node1.getTextContent();System.out.println(content);//2.得到所有的标签Node root = doc.getElementsByTagName("soft").item(0);list(root);//3.得到单个标签的属性Element china = (Element)doc.getElementsByTagName("a1").item(0); //此处强转为Element是因为//Node只有getAttributes获取全部属性String a1 = china.getAttribute("name");System.out.println(a1);}private static void list(Node node) {if(node instanceof Element)System.out.println(node.getNodeName());NodeList nl = node.getChildNodes();for(int i = 0;i<nl.getLength();i++) {Node child = nl.item(i);list(child);}}}


SAX解析

import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.ContentHandler;import org.xml.sax.Locator;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;import org.xml.sax.helpers.DefaultHandler;public class sax解析 {public static void main(String[] args) throws Exception{//创建解析工厂   得到解析器    得到读取器XMLReader reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();//设置内容处理器reader.setContentHandler(new tagValueHandler());reader.parse("src/NewFile.xml");}}//得到XML文档的所有内容class ListHander implements ContentHandler {@Overridepublic void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {System.out.println("<"+qName+">");for(int i=0;i<atts.getLength()&&atts!=null;i++) {String attName = atts.getQName(i);String attValue = atts.getValue(i);System.out.println(attName + "=" + attValue);}}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {System.out.println(new String(ch ,start , length));}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {System.out.println("</"+qName+">");} @Overridepublic void setDocumentLocator(Locator locator) {// TODO Auto-generated method stub}@Overridepublic void startDocument() throws SAXException {// TODO Auto-generated method stub}@Overridepublic void endDocument() throws SAXException {// TODO Auto-generated method stub}@Overridepublic void startPrefixMapping(String prefix, String uri) throws SAXException {// TODO Auto-generated method stub}@Overridepublic void endPrefixMapping(String prefix) throws SAXException {// TODO Auto-generated method stub}@Overridepublic void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {// TODO Auto-generated method stub}@Overridepublic void processingInstruction(String target, String data) throws SAXException {// TODO Auto-generated method stub}@Overridepublic void skippedEntity(String name) throws SAXException {// TODO Auto-generated method stub}}//获取指定标签的内容class tagValueHandler extends DefaultHandler{private String currentTag ;private int needNum = 2;private int currentNum = 0;@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {// TODO Auto-generated method stubsuper.startElement(uri, localName, qName, attributes);currentTag = qName;if("name".equals(currentTag)) {currentNum++;}}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {// TODO Auto-generated method stubsuper.characters(ch, start, length);if("name".equals(currentTag)&¤tNum == needNum) {System.out.println(new String(ch,start,length));}}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {// TODO Auto-generated method stubsuper.endElement(uri, localName, qName);currentTag = null;}}

javabean封装XML数据

import java.awt.List;import java.util.ArrayList;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;import org.xml.sax.helpers.DefaultHandler;public class T1 {public static void main(String[] args) throws Exception{XMLReader read = SAXParserFactory.newInstance().newSAXParser().getXMLReader();BeanListHandle bean = new BeanListHandle();read.setContentHandler(bean);read.parse("src/NewFile.xml");ArrayList<Person> al = bean.getList();System.out.println(al.get(0));}}class BeanListHandle extends DefaultHandler{String currentTag;ArrayList list = new ArrayList();Person person;@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {currentTag = qName;if("student".equals(currentTag)) {person = new Person();}}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {if("name".equals(currentTag)) {person.setName(new String(ch,start,length));}if("location".equals(currentTag)) {person.setLocation(new String(ch,start,length));}if("grade".equals(currentTag)) {person.setGrade(new String(ch,start,length));}}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {if("student".equals(currentTag)) {list.add(person);person = null;}currentTag = null;}public ArrayList getList() {return list;}}

dom4j解析所有XML文档

import java.io.File;import java.io.FileOutputStream;import java.io.FileWriter;import java.io.OutputStreamWriter;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;public class T1 {public static void main(String[] args) throws Exception {SAXReader reader = new SAXReader();Document document = reader.read(new File("src/NewFile.xml"));//读Element root = document.getRootElement();Element student = (Element)root.elements("student").get(1);String name = student.element("name").getText();String attr = student.attributeValue("idcard");System.out.println(name);System.out.println(attr);//为李四再添加一个成绩150student.addElement("grade").setText("150");XMLWriter out = new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/NewFile.xml"),"UTF-8"));out.write(document);out.close();}}


阅读全文
0 0
原创粉丝点击