java解析xml常用的三种方法 - - ITeye技术网站
1>得到DOM解析器的工厂实例
DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
得到javax.xml.parsers.DocumentBuilderFactory;类的实例就是我们要的解析器工厂
DocumentBuilder dombuilder=domfac.newDocumentBuilder();
通过javax.xml.parsers.DocumentBuilderFactory实例的静态方法newDocumentBuilder()得到DOM解析器3>把要解析的XML文档转化为输入流,以便DOM解析器解析它
InputStream is=new FileInputStream(“bin/library.xml”);
InputStream是一个接口。
Document doc=dombuilder.parse(is);
由XML文档的输入流得到一个org.w3c.dom.Document对象,以后的处理都是对Document对象进行的
Element root=doc.getDocumentElement();
在DOM中只有根节点是一个org.w3c.dom.Element对象。6>得到节点的子节点
NodeList books=root.getChildNodes();
for(int i=0;i<books.getLength();i++){
Node book=books.item(i);
}
这是用一个org.w3c.dom.NodeList接口来存放它所有子节点的,还有一种轮循子节点的方法,后面有介绍
7>取得节点的属性值
String email=book.getAttributes().getNamedItem(“email”).getNodeValue();
System.out.println(email);
注意,节点的属性也是它的子节点。它的节点类型也是Node.ELEMENT_NODE
8>轮循子节点
for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()){
if(node.getNodeType()==Node.ELEMENT_NODE){
if(node.getNodeName().equals(“name”)){
String name=node.getNodeValue();
String name1=node.getFirstChild().getNodeValue();
…
if(node.getNodeName().equals(“price”)){
String price=node.getFirstChild().getNodeValue();
…
<SPAN style="FONT-FAMILY: courier new, courier; FONT-SIZE: small"><?xml version="1.0" encoding="UTF-8"?> <xml> <conn-params> <conn-url>jdbc:mysql://192.168.101.7:3306s</conn-url> <conn-driver>com.mysql.jdbc.Driver</conn-driver> <conn-username>root</conn-username> <conn-password>root</conn-password> </conn-params> <person> <user> <username>xzc</username> <password>sdf23223</password> <birthday>2012-01-23</birthday> </user> <user> <username>误闯</username> <password>wuchuang3223</password> <birthday>2002-01-03</birthday> </user> </person> </xml> </SPAN>
<SPAN style="FONT-FAMILY: courier new, courier; FONT-SIZE: small">package com.xcz.xml; import java.io.File; import java.io.IOException; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; import com.xcz.po.User; import com.xcz.xml.util.DomUtil; public class Dom4Xml { private DomUtil domUtil = new DomUtil(); public static void main(String[] args) { try { File f = new File("src/jdbc-params.xml"); List<User> list = new Dom4Xml().domUtil.parseXml(f); for (User user : list) { System.out.println(user); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } </SPAN>
<SPAN style="FONT-FAMILY: courier new, courier; FONT-SIZE: small">package com.xcz.xml.util; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import com.xcz.po.User; public class DomUtil { private DocumentBuilderFactory factory; private DocumentBuilder builder; private Document document; private List<User> list; /** * 创建一个DocumentBuilderFactory 对象 * @return DocumentBuilderFactory */ private DocumentBuilderFactory getDocumentBuilderFactory(){ return DocumentBuilderFactory.newInstance(); } /** * 创建一个DocumentBulider 对象 * @param DocumentBuilderFactory fac * @return DocumentBuilder * @throws ParserConfigurationException */ private DocumentBuilder getDocumentBuilder(DocumentBuilderFactory fac) throws ParserConfigurationException{ return fac.newDocumentBuilder(); } /** * 功能:解析XML文件 * @param file xml文件 * @return List<User> * @throws ParserConfigurationException * @throws SAXException * @throws IOException */ public List<User> parseXml(File file) throws ParserConfigurationException, SAXException, IOException{ factory = getDocumentBuilderFactory(); builder = getDocumentBuilder(factory); document = builder.parse(file); List<User> list = parseXmlProcess(document); return list; } /** * 功能:xml文件具体解析过程 * @param document * @return List<User> */ private List<User> parseXmlProcess(Document document){ list = new ArrayList<User>(); //获取根节点 Element root = document.getDocumentElement(); //获取根节点下面的所有孩子节点 NodeList childNodes = root.getChildNodes(); for(int i=0; i<childNodes.getLength(); i++){//获取节点集合长度:getLength() Node node = childNodes.item(i);//获取第index 节点:item(index) if("person".equals(node.getNodeName())){//获取当前节点tagName:getNodeName() NodeList pChildNodes = node.getChildNodes(); for(int p=0; p<pChildNodes.getLength(); p++){ Node pNode = pChildNodes.item(p); if("user".equals(pNode.getNodeName())){ User user = new User(); NodeList uChildNodes = pNode.getChildNodes(); for(int u=0;u<uChildNodes.getLength();u++){ Node uNode = uChildNodes.item(u); if("username".equals(uNode.getNodeName())){ user.setUsername(uNode.getTextContent());//获取当前节点的具体内容:getTextContent() } if("password".equals(uNode.getNodeName())){ user.setPassword(uNode.getTextContent()); } if("birthday".equals(uNode.getNodeName())){ user.setBirthday(uNode.getTextContent()); } } list.add(user); } } } } return list; } }</SPAN>
java解析xml常用的三种方法 – – ITeye技术网站
- XML 文字 节点
- XML 元素 节点
- XML 处理指令
- XML 注释
<person> <user> <username>谢成志</username> <password>6626310xie</password> <sex>男</sex> <birthday>1988/11/28</birthday> <headpic> <pictitle>ermao</pictitle> <picurl>images/head1.jpg</picurl> </headpic> </user> </person>
java解析xml常用的三种方法 – – ITeye技术网站
此为下面即将解析度简单xml结构,并将其封装成一个User对象。
<SPAN style="FONT-FAMILY: courier new, courier; FONT-SIZE: small">package com.xcz.xml; import java.io.File; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import com.xcz.util.SaxUtil; public class Sax4XML { public static void main(String[] args) { try { //1.获取factory SAXParserFactory factory = SAXParserFactory.newInstance(); //2.获取parser SAXParser parser = factory.newSAXParser(); //3.获取解析时的监听器对象 SaxUtil su = new SaxUtil(); //4.开始解析 parser.parse(new File("src/user-params.xml"), su); System.out.println(su.getUser()); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } </SPAN>
<SPAN style="FONT-FAMILY: courier new, courier; FONT-SIZE: small">package com.xcz.util; import java.text.ParseException; import java.text.SimpleDateFormat; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.xcz.po.HeadPic; import com.xcz.po.User; /** * 定义xml解析时的监听类 * * 实现方式有很多,可以实现接口:ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler * 但我们常用的继承:DefaultHandler */ public class SaxUtil extends DefaultHandler { private User user; private HeadPic headPic; private String content; private SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); @Override public void characters(char[] ch, int start, int length) throws SAXException { content = new String(ch, start, length); } //当解析到文本开始时触发 @Override public void startDocument() throws SAXException { super.startDocument(); } //当解析到文本结束时触发 @Override public void endDocument() throws SAXException { super.endDocument(); } //当解析到元素开始时触发 @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { if("user".equals(name)) { user = new User(); } if("headpic".equals(name)) { headPic = new HeadPic(); } } //当解析到元素结束时触发 @Override public void endElement(String uri, String localName, String name) throws SAXException { if("username".equals(name)) { user.setUsername(content); } if("password".equals(name)) { user.setPassword(content); } if("sex".equals(name)) { user.setSex(content); } if("birthday".equals(name)) { try { user.setBirthday(sdf.parse(content)); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if("pictitle".equals(name)) { headPic.setPicTitle(content); } if("picurl".equals(name)) { headPic.setPicUrl(content); user.setHeadPic(headPic); } } public User getUser(){ return user; } }</SPAN>
java解析xml常用的三种方法 – – ITeye技术网站
[优点]
(1).节约内存开销
SAX解析器在某些方面优于DOM风格解析器,因为SAX解析器的内存使用量一般远低于DOM解析器使用量。DOM解析器在任何处理开始之前,必须将xml以整棵树放在内存,所以DOM解析器的内存使用量完全根据输入资料的大小。相对来说,SAX解析器的内存内容,是只基于XML档案的最大深度(XML树的最大深度)和单一XML项目上XML属性储存的最大资料。
(2)解析速度快
因为SAX事件驱动的本质,处理文件通常会比DOM风格的解析器快。
[缺点]
SAX事件驱动的模型对于XML解析很有用,但它确实有某些缺点。
某些种类的XML验证需要存取整份文件。例如,一个DTD IDREF属性需要文件内有项目使用指定字串当成DTD ID属性。要在SAX解析器内验证,必须追踪每个之前遇过的ID和IDREF属性,检查是否有任何相符。更甚者,一个IDREF找不到对应的ID,使用者只会在整份文件都解析完后才发现,若这种连结对于建立有效输出是重要的,那用在处理整份文件的时间只是浪费。
另外,某些XML处理仅要求存取整份文件。举例来说,XSLT及XPath需要能够任何时间存取任何解析过的XML树。当SAX以用来建构此树时,DOM解析器在设计上已经是如此了。