javaweb之xml以及其约束

命名规范
一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
区分大小写,例如,<P>和<p>是两个不同的标记。
不能以数字或"_" (下划线)开头。
不能以xml(或XML、或Xml 等)开头。
不能包含空格。
名称中间不能包含冒号(:)。


一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:
<input name=“text”>
属性值一定要用双引号(")或单引号(')引起来
定义属性必须遵循与标签相同的命名规范
多学一招:在XML技术中,标签属性所代表的信息,也可以被改成用子元素的形式来描述,例如:
<input>
<name>text</name>
</input>


转义字符
< &lt;
& &amp;
" &quot;
' &apos;
只有"<" 字符和"&"字符对于XML来说是严格禁止使用的


CDATA区
在编写XML文件时,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。
语法:<![CDATA[ 内容 ]]>
<![CDATA[
<itcast>
<br/>
</itcast>
]]>




处理指令
简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。


处理指令必须以“<?”作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。
<? xml version="1.0" encoding="utf-8"?>
例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。
<?xml-stylesheet type="text/css" href="p.css"?>




常用的约束技术
XML DTD (Document Type Definition),全称为文档类型定义
XML Schema




DTD约束----外部引入
DTD文件在本地
在xml文件中引用DTD的方式:
<!DOCTYPE 文档根结点 SYSTEM "">
例如: <!DOCTYPE 书架 SYSTEM “book.dtd”>
DTD文件在公用的网络
在xml文件中引用DTD的方式:
<!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">
例如:<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">


DTD属性定义2
#REQUIRED:必须设置该属性
#IMPLIED:可以设置也可以不设置
#FIXED:说明该属性的取值固定为一个值,在 XML 文件中不能为该属性设置其它值。但需要为该属性提供这个值
直接使用默认值:在 XML 中可以设置该值也可以不设置该属性值。若没设置则使用默认值。


常用属性值类型
CDATA:表示属性值为普通文本字符串。
ENUMERATED (枚举)
ID
38 属性值类型ENUMERATED
属性的类型可以是一组取值的列表,在 XML 文件中设置的属性值只能是这个列表中的某个值(枚举)
<?xml version = "1.0" encoding="utf-8"?>
<!DOCTYPE 购物篮 [
<!ELEMENT 购物篮 (肉+)>
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]>
<购物篮>
<肉 品种="鱼肉"/>
<肉 品种="牛肉"/>
<肉/>
</购物篮>


实体(Entity)定义
实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
在DTD定义中,一条<!ENTITY …>语句用于定义一个实体。


40 语法格式:
<!ENTITY 实体名称 “实体内容” >
引用方式:&实体名称;


<!DOCTYPE person [
<!ENTITY resume "I am a programmer1">
<!ELEMENT person (#PCDATA)>
<!ATTLIST person name CDATA #REQUIRED>
]>
<person name="Tom">&resume;</person>


44 XML解析方式分为三种:dom、sax和pull
dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。
sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。
pull: Pull解析和Sax解析很相似,都是轻量级的解析,它是一个第三方开源的Java项目,但在Android的内核中已经嵌入了Pull 。
XML解析开发包
Jaxp(javax.xml、org.w3c.dom 、org.xml.sax )
Jdom、dom4j


Node appendChild(newChild) 将新的节点添加为最后一个子节点
insertBefore(newChild,refChild) 在某个子节点前插入一个新子节点
removeChild(oldChild) 删除指定的某个子节点
replaceChild(newChild,oldChild) 将指定的子节点替换成新的子节点
setTextContent(textContent) 设置文本内容(一般用在元素对象上)
getNodeName() 得到节点名称(一般用在元素对象上)
getParentNode() 得到父节点(一般用在元素对象上)
getTextContent() 得到文本内容(一般用在元素对象上)
getFirstChild() 得到第一个子节点
getLastChild() 得到最后一个子节点
getNextSibling() 得到下一个兄弟节点
getPreviousSibling() 得到上一个兄弟节点


Document createElement(name) 创建一个指定名称的标签对象返回
getDocumentElement () 得到文档的根元素对象
getElementById(id) 根据子元素的id属性找到对应的子元素
getElementsByTagName(name) 根据标签名得到对应的子标签的集合


Element
setAttribute(name, value) 设置元素的属性名和属性值
removeAttribute(attrName) 根据属性名删除对应的属性
getAttribute(attrName) 根据属性名得到对应的属性
getElementsByTagName(name) 根据标签名得到对应的子标签的集合
getTagName() 得到标签名


Attr、Text 极少直接操作这两个接口的对象,一般通过Element对象来操作
NodeList getLength()得到包含的节点对象的个数 item(index)根据下标得到某个节点




DOM解析XML
以DOM的方式加载xml文件
//通过解析器对象解析一个文件对象得到Document对象
Document document =
DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("d:/users.xml"));


更新XML文件 (将document写入某个文件如“D\\users.xml"中)
Source xmlSource = new DOMSource(document);
Result outputTarget = new StreamResult(new File(“D\\users.xml"));
TransformerFactory.newInstance().newTransformer().transform(xmlSource, outputTarget);




SAX解析
sax只能用于读取xml文件,无法作更新
SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器


得到一个XML的读取器
XMLReader xmlReader=SAXParserFactory.newInstance().newSAXParser().getXMLReader();
设置读取器的事件处理器
xmlReader.setContentHandler(new BookContentHandler())
// 读取XML文档
reader.parse("src/books.xml");




Pull解析
pull解析也只能用于读取xml文件,无法作更新
Pull解析:加载每一部分数据产生方法调用,都必须通过程序员调用一个固定的方法才能进行下去,
否则解析工作就停止了。
所需jar包:xmlpull_1_0_5.jar, kxml2-2.3.0.jar
//得到pull解析器:XMLPullParser
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
//传入要读取的XML文件
parser.setInput(new FileInputStream("src/books.xml"),"UTF-8");
//读第一部分:得到读到的当前部分的类型 int
int eventType = parser.getEventType();




DOM4J解析XML
DOM4j中,获得Document对象的方式有三种:一般就用第一种


1.读取XML文件,获得document对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File( "input.xml“ ));
2.获得document对象对象.
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);
3.主动创建空document对象.
Document document = DocumentHelper.createDocument();//创建根节点
Element root = document.addElement( "members");


DOM4J将文档写入XML文件
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");//设置输出流使用的字符编码
XMLWriter writer = new XMLWriter(new FileOutputStream("src/books.xml"), format);
writer.write(document);
writer.close();


XPath
使用XPath必须导入jaxen-1.1-beta-6.jar
否则出现
NoClassDefFoundError: org/jaxen/JaxenException
获取所有符合条件的节点
document.selectNodes(String xpathExpression)
返回List集合
获取符合条件的单个节点
document.selectSingleNode(String xpathExpression)
返回一个Node对象。
如果符合条件的节点有多个,那么返回第一个。


Schema约束
扩展名通常为.xsd
模式文档(Schema)-->实例文档(xml)
把XML Schema文档声明的元素绑定到一个命名空间(URI)上,XML文件就可以通过这个URI(即名称空间)
告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束.
使用名称空间引入多个XML Schema
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns="http://www.it315.org/xmlbook/schema"
xmlns:demo="http://www.it315.org/demo/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.it315.org/xmlbook/schema http://www.it315.org/xmlbook.xsd
http://www.it315.org/demo/schema
http://www.it315.org/demo.xsd">
<书>
<书名>JavaScript网页开发</书名>
<作者>张孝祥</作者>
<售价 demo:币种=”人民币”>28.00元</售价>
</书>
</书架>





























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值