Posted on 2009-06-07 01:22
飘摇 阅读(1276)
评论(0) 编辑 收藏 所属分类:
Java 核心技术
xml作为存贮数据的高效率载体,解析xml文件也是一件很重要的技能,尤其是在大量数据处理的程序中,下面就两种解析技术进行比较。
-----------------------------------------------------------------------------------------------------------
先来看看xml文件,xml文件是按严格的格式来书写的。他的元素都是成对出现的,不允许元素交叉出现,属性可以写在标签内,解析他的时候要用到解析器,解析器是一个程序,它读入一个文件,确认它有正确的格式,然后把它分解成各个元素,是我们可以使用这些元素,
<font>
<name>Helvetica</name>
<size> 36</size>
</font>
1.--------------------DOM解析 文档对象模型,也称为树形解析,将读入的文件转换为树结构,适合数据量不大的解析。
要读入一个文档,首先要一个DocumentBuilder对象,你可以从DocumentBuilderFactory工厂中得到。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//调用静态方法产生,单例用法
DocumentBuilder builder = factory.newDocumentBuilder();
现在可以从文件中读入文档了。。。。。
File f = "xx.xml";
Document doc = builder.parse(f);
或是用一个url
URL u = ......
Document doc = builder.parse(u);
还可以是任意的输入流
InputStream in = .......
Document doc = builder.parse(in);
Document 对象是xml文档的树形结构在内存中的表现。它有实现Node接口以及其它子接口的类对象构成,
可以调用getDocumentElement方法来分析文档内容,它将返回跟元素
Element root = doc.getDocumentElement();
root.getTagName()返回字符串"font";getChildNodes()得到该元素的子元素(可以是子元素,文本,注释或其他节点),它将返回一个NodeList集合
你可以这样枚举多有元素
NodeList children = root.getChildNodes();
for(int i= 0 ;i<children.getLength();i++)
{
Node child = children.item(i);
.......
}
分析元素要仔细了,假如你正在处理上面的xml文档,可能你希望得到font的两个元素。但是解析却告诉你有5个;
<font>和 <name>之间的空白字符
name元素
</name> 和<size>之间的空白字符
size元素
</size> 和</font>之间的空白字符
如果你希望得到子元素,可以忽略空白字符
for(int i=0;i<children.getLength();i++){
Node child= children.item(i);
if(child instanceof Element){
Element childElement = (Element)child;
}
}//当然你也可以定义DTD文档这样解析是可以自动去掉空白字符。
2.---------------------SAX解析 流解析机制 以事件触发型解析,处理数据量大的文件,
SAX解析器是在解析XML输入的构件时就报告事件,但不会以任何方式存储文档,有事件处理器决定是否要建立数据结构,实际上,DOM解析器是在SAX解析器基础上建立起来的,
sax解析时,需要一个处理器来解析,要实现ContentHandler 接口,他定义了很多回调方法。
如 startElement endElement 在每当遇到起始或结束时各调用一次。
characters每当遇到字符时调用,
startDocument endDocument分别在文档开始和结束时各调用一次。
下面我们举个例子,打印文件中所有的链接<a href=""> 它只覆盖了处理器得到startElement方法,用来检测a 属性为href 的链接,他的潜在用途就是网络爬虫 ,即沿着一个链接到达越来越多的网页程序。
SAXParseFactory factory = SAXParseFactory.newIntace();
SAXPares parse = factory.newSAXParse();
parse.parse(source,handler)//source是要处理的文件, handler 处理器的一个子类defaultHandler 他实现了四个接口。
DefaultHandler hander = new DefaultHandler(){
public void startElement(String namespaceURI,String lname, String qname,Attribute attrs) throws SAXException
//qname 报告限定名。
{
if(lname.equalsIgnorCase("a")&& attrs!=null){
for(int i=0 ; i<attrs.getLength();i++){
String name = attrs.getLocalName(i);
if(name.equealIgnoreCase("href"))
System.out.println(attrs.getValue(i));
}
}
}
----------------------------------另外还有一种StAX解析器,是一种拉解析(pull parse),与安装事件处理器不同,你只需要使用下面的基本循环俩迭代所有事件。
InputStream in = url.openStream();
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader parse = factory.createXMLStreamReader(in);
while(parse.hasNext(0){
in event = parser.next();
}
------------------------------------------------还在学习中,希望上面的可以对大家有些帮助。
};