Java核心编程十一:XML处理


0 XML基础
正确的XML分为两类,一类是well-formed,一类是validating的。前者是只要符合XML语法即可,而后者还需要满足DTD或Schema的定义。

这里只介绍well-formed的XML的格式要求。
a XML的第一行必须是声明,其中包含版本和文档体的字符编码。
b XML中只能有一个根元素。
c 标记必须正确地关闭。
d 标记可以嵌套,但不能交叉。
e 属性必须用""括起来。
f 控制标记、指令和属性名称区分大小写。
g 不需要解释的字符串放在CDATA块中
h 空白与html处理不同

1 XML的解析
在javax.xml.*众多包中提供了担任XML的一些工具类。
在org.w3c.*众多包中提供了DOM模型的抽象及各种操作。
而org.xml.sax则提供了使用sax处理的接口。

下图是Dom模型中提供的各种对象。

因此,要解析XML文档,只需要使用解析器获得到DOM对象后,即可进行各种遍历操作。

javax.xml.parsers.DocumentBuilderFactory类
static DocumentBuilderFactory newInstance() 实例化方法
DocumentBuilder newDocumentBuilder()  获取文档解析器对象

javax.xml.parsers.DocumentBuilder
Document parse(File f)
Document parse(String url)
Document parse(InputStream in)

org.w3c.dom.Document接口
Element getDocumentElement()  获取根结点元素

org.w3c.dom.Element接口
String getTagName()  获取元素的标签名
String getAttribute(String name)  获取属性的值

org.w3c.dom.Node类
NodeList getChildNodes()  获取子结点的结点列表
Node getFirstChild()      获取第一个子结点
Node getLastChild()
Node getNextSibling()   获取下一个兄弟结点
Node getPreviousSibling()
Node getParentNode()    获取父亲结点
String getNodeName()
String getNodeValue() 获取结点值
NamedNodeMap getAttribute() 获取结点的属性集

NodeList类
int getLength()     获取长度
Node item(int idx)  获取指定索引的结点

NamedNodeMap类
int getLength()     获取长度
Node item(int idx)  获取指定索引的结点

2 XML验证
javax.xml.validation包提供了进行xml验证的工具。

3 XPATH
XPATH提供了一套自己的语言,以路径式的访问机制对DOM树进行遍历。
以/root/child/child1[exp]的形式访问节点值。
以/root/child/child1[exp]/@key的形式访问节点的属性。
以/root/child/comment() 获取child的注释
以/root/child/text() 获取child的text
XPATH表达式支持节点通配符,*可以匹配任意元素,@*可以配置任意属性节点
在[]中支持谓词扩展。具体可以查找XPATH的文档。
这种方式适合对于已知结构的XML文档进行信息提取,而SAX和DOM则更适合于对未知结构XML进行处理。


javax.xml.xpath包提供了使用xpath的相关类

javax.xml.xpath.XPathFactory类
static XPathFactory newInstance() 获取工厂实例
XPath newXpath() 工厂对象返回一个xpath对象

javax.xml.XPath类
String evaluate(String pattern,Source src) 从指定的输入源进行查找
String evaluate(String path,Object node) 从指定的结点,查找指定路径的值
Object evaluate(String path,Object node,QName resutType)  增加返回结果的类型,NODE / NODESET / STRING / NUMBER / BOOL等常量,如果类型为nodeset,则返回的实际类型为NodeList类型。

4 使用名字空间
javax.xml.parsers.DocumentBuilder
void setNamespaceAware(bool val) 设置是否打开命名空间

5 使用SAX
org.xml.sax中定义了使用SAX处理XML的接口。
ContentHandler接口类提供了使用SAX处理时必须定义的事件处理函数,如startElement/endElement,startDocument/endDocument,characters

类似于DOM解析,我们先通过工厂创建出解析器,再让解析器去处理文档
javax.xml.SAXParserFactory类
static SAXParserFactory newInstance()
SAXParser newSAXParser()
void setNamespaceAware(bool )

javax.xml.SAXParser
void parse(File f,DefaultHandler h)
void parse(String url,DefaultHandler h)
void parse(InputStream in,DefaultHandler h)

org.xml.sax.ContentHandler
void startDocument()
void endDocument()
void startElement(String ns,string lname,string fullname,Attribute att)
void endElement(String ns,string lname,string fullname)
void characters(char[] data,int start,int length)

org.xml.sax.Attributes类
int getLength()
String getLocalName(int idx)
String getValue(int idx)
String getValue(String key)



6 生成DOM
使用Dom模型提供的操作,可以创建一个完整的XML的DOM树。
javax.xml.Pareser.DocuementBuilder
Document newDocument()

org.w3c.dom.Document
Element createElement(String )
Text createTextNode(String)

org.w3c.dom.Node
Node appendChild(Node)

org.w3c.dom.Element
void setAttribute(String name,String val)
void setAttributeNS(String uri,String name,String val)

7 生成XML文档
当前输出成XML最好的方法是使用XSL转换器提供的transform方法。
其使用方法和解析器类似,先通过工厂获得转换器,然后设置转换器,将源转换为输出。

javax.xml.transform.TransformerFactory
static TransformerFactory newInstance()
Transformer newTransformer()

javax.xml.transform.Transformer
void setOutputProperty(String name,String value)
void transform(Source from,Result to)

有几个类从Source接口所继承,从Result接口继承

javax.xml.transform.dom.DOMSource/StreamSource
DOMSource(Node n)     从一个DOM结构初始构造
StreamSource(File f)  从一个文件构造
StreamSource(String url)  从一个URL地址构造
StreamSource(InputStream in) 从一个输入流构造

javax.xml.transform.stream.StreamResult/DOMResult
StreamResult(File f)  将结构写入到文件
StreamResult(OutputStream out)  写入到输出流
StreamResult(Writer writer)   写入到打字器
DOMResult(Document doc)  写入到DOM对象


8 使用XSLT
用于将XML转换成其他的如HTML的文本。转换方式是由XSLT文档来实现,这也是一个XML文件。因此和上节相比,增加的一点只是在初始化Transformer时,将xsl文档传递给它,其他代码是类似的。

9 XML绑定
JAXB提供了一种从普通对象和XML的互相转换的方式。JAXB提供了一系列的注解来说明类的成员如何对应XML元素,marshal接口用于将对象转换成XML,而unmarshal用于将XML转换成对象。

javax.xml.bind.JAXB类:提供一系列静态方法,用于对象与XML的相互转换
static void marshal(Object o,File f)  将对象转换成XML形式写入文件
static void marshal(Object o,OutputStream os) 写到输出流
static void marshal(Object o,Result r) 写入到转换后对象
static void marshal(Object o,String s) 写入到字符串
static void marshal(Object o,URL u) 向URL提交数据

static <T> T unmarshal(File f,Class<T> c) 从文件的XML重建对象
static <T> T unmarshal(InputStream is,Class<T> c) 从输入流的XML来重建对象
static <T> T unmarshal(Source src,Class<T> c) 从源XML来重建对象
static <T> T unmarshal(String s,Class<T> c) 从字符串来重建对象
static <T> T unmarshal(URL u,Class<T> c) 从指定URL链接来重建对象

javax.xml.bind.Marshaller与javax.xml.bind.Unmarshaller
接口提供的marshal与unmarshal与JAXB类的接口是类似的。
void setProperty(String key,String value) 设置转换控制的一些属性
unmarshal没有支持的属性,marshal支持如下属性:
String encoding
bool output
String schemaLocation

javax.xm..bind.JAXBContext


其所对应的XML文档如下


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值