xml专题
需要解析的文件PEOPLE.xml
<?xml version="1.0"?> <PEOPLE hello="world"> <PERSON PERSONID="E01"> <NAME>Tony Blair</NAME> <ADDRESS>10 Downing Street, London, UK</ADDRESS> <TEL>(061) 98765</TEL> <FAX>(061) 98765</FAX> <EMAIL>blair@everywhere.com</EMAIL> </PERSON> <PERSON PERSONID="E02"> <NAME>Bill Clinton</NAME> <ADDRESS>White House, USA</ADDRESS> <TEL>(001) 6400 98765</TEL> <FAX>(001) 6400 98765</FAX> <EMAIL>bill@everywhere.com</EMAIL> </PERSON> <PERSON PERSONID="E03"> <NAME>Tom Cruise</NAME> <ADDRESS>57 Jumbo Street, New York, USA</ADDRESS> <TEL>(001) 4500 67859</TEL> <FAX>(001) 4500 67859</FAX> <EMAIL>cruise@everywhere.com</EMAIL> </PERSON> <PERSON PERSONID="E04"> <NAME>Linda Goodman</NAME> <ADDRESS>78 Crax Lane, London, UK</ADDRESS> <TEL>(061) 54 56789</TEL> <FAX>(061) 54 56789</FAX> <EMAIL>linda@everywhere.com</EMAIL> </PERSON> </PEOPLE>
1、dom:document object model文档对象模型 IDL inteface description language
读、写
2、sax simple aips for xml 解析的简单api 民间标准 基于事件处理 观察者模式
读
如tomcat
jaxp: java apis for xml parsing,对xml进行解析的java apis 本身用到了工厂方法
对于dom和sax来说,处理文档的过程
1)获得解析器工厂
2)获得具体的解析器实例
3)通过解析器对xml进行处理。
Dom步骤:
1)获得解析器工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
2)获得具体的解析器实例
DocumentBuilder builder=factory.newDocumentBuilder();
3)通过解析器实例来获得Doucument对象 Doucument对象代表整个xml文档,并不只代表根
Doucument对象又叫文档的根节点,
而整个xml第一个节点叫根元素节点(如PERSON节点)。
Document doc = builder.parse(new File("people.xml"));
4)
NodeList list = doc.getElementsByTagName("PERSON");
for (int i=0;i<list.getLength();i++){
Element element=(Element)list.item(i);
System.out.print("NAME:" + element.getElementsByTagName("NAME").item(0).getFirstChild().getNodeValue());
System.out.println("ADDRESS:" + doc.getElementsByTagName("ADDRESS").item(0).getFirstChild().getNodeValue());
}
SAX步骤:
1)获得解析器工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
2)获得具体的解析器实例
SAXParser parser=factory.newSAXParser();
3)开始解析文档
parser.parser(new File(''people.xml")),new DefaultHandler());
class MyHandler extends DefaultHander
{ @Override
public void startDocument() throws SAXException
{System.out.println("+++++++++Start Document++++++++")}
@Override
public void endDocument() throws SAXException
{System.out.println("+++++++++End Document++++++++")}
@Override//输出每个元素的标识如“PERSON”;“NAME”;“ADDRESS”
public void startElement(String url,String localName,String name) throws SAXException
{System.out.println("start element name"+name)}
@Override//输入每个元素对应的值。
public void characters(char[] ch,int start,int length) throws SAXException
{String content= new String(ch,start,lenth);
System.out.println("element content"+content)
}
}
3、解析后,通过递归原样输出XML文件
package com.observer2;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DOMTreeTest
{
public static void main(String[] args) throws Exception
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("People.xml"));
Element root = document.getDocumentElement();
parseXML(root);
}
public static void parseXML(Element e)
{
System.out.print("<" + e.getTagName());
NamedNodeMap map = e.getAttributes();
if(null != map)
{
for(int i = 0 ; i < map.getLength() ; ++i)
{
Node node = map.item(i);
System.out.print(" " + node.getNodeName() + "=\"" + node.getNodeValue() + "\"");
}
System.out.print(">");
}
NodeList list = e.getChildNodes();
for(int i = 0 ;i < list.getLength() ; ++i)
{
Node node = list.item(i);
//表明该节点是一个元素
if(Element.ELEMENT_NODE == node.getNodeType())
{
parseXML((Element)node);
}
else
{
System.out.print(node.getNodeValue());
}
}
System.out.print("</" + e.getNodeName() + ">");
}
}
开发时jdom和dom4j比较多
附件为包含了“详细原代码”。