java中xml解析的xml解析

10:19 提问
求大牛们帮忙,介绍一下java解析多层xml
假设xml文档如下
那么该如何解析输出如下
求大牛们能给出java dom解析的代码,特别是判断文本内容的部分,也就是循环到哪里就能输出文本内容
按赞数排序
&?xml version="1.0" encoding="UTF-8"?&yy72zz52
&?xml version="1.0" encoding="UTF-8"?&yy72zz52
java中解析xml的工具不是一搜一大堆。可以使用dom4j
使用dom4j,
java解析XML的不是很多吗,,sax的也有
其他相似问题java中XML解析
这个种文件类型的该如何解析
直接用Java自带的JAXB就可以解析吧。
参考:/java/jaxb-hello-world-example/
哈哈,这位仁兄是在接入航信的电子发票吧。啧啧 &去年做的~
DOM4J,用选择器,就和用jQuery一样舒服。
搜索一下, 很多lib, 看看api文档, demo14084人阅读
java技术(17)
XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已。基本的解析方式有两种,一种叫SAX,另一种叫DOM。SAX是基于事件流的解析,DOM是基于XML文档树结构的解析。假设我们XML的内容和结构如下:&
&?xml version=&1.0& encoding=&UTF-8&?&
&employees&
&employee&
&name&ddviplinux&/name&
&sex&m&/sex&
&age&30&/age&
&/employee&
&/employees&
本文使用JAVA语言来实现DOM与SAX的XML文档生成与解析。&
首先定义一个操作XML文档的接口XmlDocument 它定义了XML文档的建立与解析的接口。
package com.alisoft.facepay.framework.
* 定义XML文档建立与解析的接口
public interface XmlDocument {
* 建立XML文档
* @param fileName 文件全路径名称
public void createXml(String fileName);
* 解析XML文档
* @param fileName 文件全路径名称
public void parserXml(String fileName);
1.DOM生成和解析XML文档
为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。&
package com.alisoft.facepay.framework.
import java.io.FileInputS
import java.io.FileNotFoundE
import java.io.FileOutputS
import java.io.IOE
import java.io.InputS
import java.io.PrintW
import javax.xml.parsers.DocumentB
import javax.xml.parsers.DocumentBuilderF
import javax.xml.parsers.ParserConfigurationE
import javax.xml.transform.OutputK
import javax.xml.transform.T
import javax.xml.transform.TransformerConfigurationE
import javax.xml.transform.TransformerE
import javax.xml.transform.TransformerF
import javax.xml.transform.dom.DOMS
import javax.xml.transform.stream.StreamR
import org.w3c.dom.D
import org.w3c.dom.E
import org.w3c.dom.N
import org.w3c.dom.NodeL
import org.xml.sax.SAXE
* DOM生成与解析XML文档
public class DomDemo implements XmlDocument {
private String fileN
public void init() {
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
this.document = builder.newDocument();
} catch (ParserConfigurationException e) {
System.out.println(e.getMessage());
public void createXml(String fileName) {
Element root = this.document.createElement(&employees&);
this.document.appendChild(root);
Element employee = this.document.createElement(&employee&);
Element name = this.document.createElement(&name&);
name.appendChild(this.document.createTextNode(&丁宏亮&));
employee.appendChild(name);
Element sex = this.document.createElement(&sex&);
sex.appendChild(this.document.createTextNode(&m&));
employee.appendChild(sex);
Element age = this.document.createElement(&age&);
age.appendChild(this.document.createTextNode(&30&));
employee.appendChild(age);
root.appendChild(employee);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
DOMSource source = new DOMSource(document);
transformer.setOutputProperty(OutputKeys.ENCODING, &gb2312&);
transformer.setOutputProperty(OutputKeys.INDENT, &yes&);
PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
StreamResult result = new StreamResult(pw);
transformer.transform(source, result);
System.out.println(&生成XML文件成功!&);
} catch (TransformerConfigurationException e) {
System.out.println(e.getMessage());
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (TransformerException e) {
System.out.println(e.getMessage());
public void parserXml(String fileName) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(fileName);
NodeList employees = document.getChildNodes();
for (int i = 0; i & employees.getLength(); i++) {
Node employee = employees.item(i);
NodeList employeeInfo = employee.getChildNodes();
for (int j = 0; j & employeeInfo.getLength(); j++) {
Node node = employeeInfo.item(j);
NodeList employeeMeta = node.getChildNodes();
for (int k = 0; k & employeeMeta.getLength(); k++) {
System.out.println(employeeMeta.item(k).getNodeName()
+ &:& + employeeMeta.item(k).getTextContent());
System.out.println(&解析完毕&);
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (ParserConfigurationException e) {
System.out.println(e.getMessage());
} catch (SAXException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println(e.getMessage());
2.SAX生成和解析XML文档
为解决DOM的问题,出现了SAX。SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:A只需XML文档的少量内容,很少回头访问;机器内存少;
package com.alisoft.facepay.framework.
import java.io.FileInputS
import java.io.FileNotFoundE
import java.io.IOE
import java.io.InputS
import javax.xml.parsers.ParserConfigurationE
import javax.xml.parsers.SAXP
import javax.xml.parsers.SAXParserF
import org.xml.sax.A
import org.xml.sax.SAXE
import org.xml.sax.helpers.DefaultH
* SAX文档解析
public class SaxDemo implements XmlDocument {
public void createXml(String fileName) {
System.out.println(&&&&+filename+&&&&);
public void parserXml(String fileName) {
SAXParserFactory saxfac = SAXParserFactory.newInstance();
SAXParser saxparser = saxfac.newSAXParser();
InputStream is = new FileInputStream(fileName);
saxparser.parse(is, new MySAXHandler());
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
class MySAXHandler extends DefaultHandler {
boolean hasAttribute =
Attributes attributes =
public void startDocument() throws SAXException {
System.out.println(&文档开始打印了&);
public void endDocument() throws SAXException {
System.out.println(&文档打印结束了&);
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (qName.equals(&employees&)) {
if (qName.equals(&employee&)) {
System.out.println(qName);
if (attributes.getLength() & 0) {
this.attributes =
this.hasAttribute =
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (hasAttribute && (attributes != null)) {
for (int i = 0; i & attributes.getLength(); i++) {
System.out.println(attributes.getQName(0)
+ attributes.getValue(0));
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch, start, length));
3.DOM4J生成和解析XML文档
DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。
package com.alisoft.facepay.framework.
import java.io.F
import java.io.FileW
import java.io.IOE
import java.io.W
import java.util.I
import org.dom4j.D
import org.dom4j.DocumentE
import org.dom4j.DocumentH
import org.dom4j.E
import org.dom4j.io.SAXR
import org.dom4j.io.XMLW
* Dom4j 生成XML文档与解析XML文档
public class Dom4jDemo implements XmlDocument {
public void createXml(String fileName) {
Document document = DocumentHelper.createDocument();
Element employees=document.addElement(&employees&);
Element employee=employees.addElement(&employee&);
Element name= employee.addElement(&name&);
name.setText(&ddvip&);
Element sex=employee.addElement(&sex&);
sex.setText(&m&);
Element age=employee.addElement(&age&);
age.setText(&29&);
Writer fileWriter=new FileWriter(fileName);
XMLWriter xmlWriter=new XMLWriter(fileWriter);
xmlWriter.write(document);
xmlWriter.close();
} catch (IOException e) {
System.out.println(e.getMessage());
public void parserXml(String fileName) {
File inputXml=new File(fileName);
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(inputXml);
Element employees=document.getRootElement();
for(Iterator i = employees.elementIterator(); i.hasNext();){
Element employee = (Element) i.next();
for(Iterator j = employee.elementIterator(); j.hasNext();){
Element node=(Element) j.next();
System.out.println(node.getName()+&:&+node.getText());
} catch (DocumentException e) {
System.out.println(e.getMessage());
System.out.println(&dom4j parserXml&);
4.JDOM生成和解析XML&&
为减少DOM、SAX的编码量,出现了JDOM;优点:20-80原则,极大减少了代码量。使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。
package com.alisoft.facepay.framework.
import java.io.FileNotFoundE
import java.io.FileOutputS
import java.io.IOE
import java.util.L
import org.jdom.D
import org.jdom.E
import org.jdom.JDOME
import org.jdom.input.SAXB
import org.jdom.output.XMLO
* JDOM 生成与解析XML文档
public class JDomDemo implements XmlDocument {
public void createXml(String fileName) {
root=new Element(&employees&);
document=new Document(root);
Element employee=new Element(&employee&);
root.addContent(employee);
Element name=new Element(&name&);
name.setText(&ddvip&);
employee.addContent(name);
Element sex=new Element(&sex&);
sex.setText(&m&);
employee.addContent(sex);
Element age=new Element(&age&);
age.setText(&23&);
employee.addContent(age);
XMLOutputter XMLOut = new XMLOutputter();
XMLOut.output(document, new FileOutputStream(fileName));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
public void parserXml(String fileName) {
SAXBuilder builder=new SAXBuilder(false);
Document document=builder.build(fileName);
Element employees=document.getRootElement();
List employeeList=employees.getChildren(&employee&);
for(int i=0;iElement employee=(Element)employeeList.get(i);
List employeeInfo=employee.getChildren();
for(int j=0;jSystem.out.println(((Element)employeeInfo.get(j)).getName()+&:&+((Element)employeeInfo.get(j)).getValue());
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:425619次
积分:4608
积分:4608
排名:第5877名
原创:105篇
转载:12篇
评论:161条
(1)(1)(1)(1)(12)(1)(1)(3)(3)(1)(2)(3)(4)(1)(1)(8)(6)(1)(1)(1)(1)(1)(3)(1)(1)(9)(9)(4)(5)(3)(18)(2)(8)1691人阅读
关键字:Java解析xml、解析xml四种方法、DOM、SAX、JDOM、DOM4j、XPath
目前在Java中用于解析XML的技术很多,主流的有DOM、SAX、JDOM、DOM4j,下文主要介绍这4种解析XML文档技术的使用、优缺点及性能测试。
一、【基础知识——扫盲】
sax、dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无法解析xml文档的;jaxp只是api,它进一步封装了sax、dom两种接口,并且提供了DomcumentBuilderFactory/DomcumentBuilder和SAXParserFactory/SAXParser(默认使用xerces解释器)。
二、【DOM、SAX、JDOM、DOM4j简单使用介绍】
1、【DOM(Document Object Model) 】
由W3C提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作。
示例代码:
后文代码中有使用到text.xml(该文档放在src路径下,既编译后在classes路径下),都是指该xml文档。
该代码只要稍做修改,即可变得更加简洁,无需一直写if来判断是否有子节点。
2、【SAX (Simple API for XML) 】
SAX不用将整个文档加载到内存,基于事件驱动的API(Observer模式),用户只需要注册自己感兴趣的事件即可。SAX提供EntityResolver, DTDHandler, ContentHandler, ErrorHandler接口,分别用于监听解析实体事件、DTD处理事件、正文处理事件和处理出错事件,与AWT类似,SAX还提供了一个对这4个接口默认的类DefaultHandler(这里的默认实现,其实就是一个空方法),一般只要继承DefaultHandler,重写自己感兴趣的事件即可。
示例代码:
3、【JDOM】
JDOM与DOM非常类似,它是处理XML的纯JAVA API,API大量使用了Collections类,且JDOM仅使用具体类而不使用接口。 JDOM 它自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档(尽管它还可以将以前构造的 DOM 表示作为输入)。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档
示例代码:
4、【DOM4j】
dom4j是目前在xml解析方面是最优秀的(Hibernate、Sun的JAXM也都使用dom4j来解析XML),它合并了许多超出基本 XML 文档表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理
示例代码:
三、【性能测试】
环境:AMD.0+GHz主频 JDK6.0
运行参数:-Xms400m -Xmx400m
xml文件大小:10.7M
DOM: &581297ms
SAX: 8829ms
JDOM: 581297ms
DOM4j: 5309ms
时间包括IO的,只是进行了简单的测试,仅供参考!!!!
四、【对比】
1、【DOM】
DOM是基于树的结构,通常需要加载整文档和构造DOM树,然后才能开始工作。
&& &a、由于整棵树在内存中,因此可以对xml文档随机访问
&& &b、可以对xml文档进行修改操作
&& &c、较sax,dom使用也更简单。
&& &a、整个文档必须一次性解析完
&& &a、由于整个文档都需要载入内存,对于大文档成本高
2、【SAX】
SAX类似流媒体,它基于事件驱动的,因此无需将整个文档载入内存,使用者只需要监听自己感兴趣的事件即可。
&& &a、无需将整个xml文档载入内存,因此消耗内存少
&& &b、可以注册多个ContentHandler
&& &a、不能随机的访问xml中的节点
&& &b、不能修改文档
3、【JDOM】
JDOM是纯Java的处理XML的API,其API中大量使用Collections类,
&& &a、DOM方式的优点
&& &b、具有SAX的Java规则
&& &a、DOM方式的缺点
4、【DOM4J】
这4中xml解析方式中,最优秀的一个,集易用和性能于一身。
五、【小插曲XPath】
XPath 是一门在 XML 文档中查找信息的语言, 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 同时被构建于 XPath 表达之上。因此,对 XPath 的理解是很多高级 XML 应用的基础。
XPath非常类似对数据库操作的SQL语言,或者说JQuery,它可以方便开发者抓起文档中需要的东西。(dom4j也支持xpath)
示例代码:
六、【补充】
注意4种解析方法对TextNode(文本节点)的处理:
1、在使用DOM时,调用node.getChildNodes()获取该节点的子节点,文本节点也会被当作一个Node来返回,如:
输出的结果是:
其中\n的ASCII码为10,\t的ASCII码为9。结果让人大吃一惊,university的子节点数不是1,也不是2,而是3,这3个子节点都是谁呢?为了看得更清楚点,把xml文档改为:
还是上面的程序,输出结果为:
其中数字1的ASCII码为49,数字2的ASCII码为50。
2、使用SAX来解析同DOM,当你重写它的public void characters(char[] ch, int start, int length)方法时,你就能看到。
3、JDOM,调用node.getChildren()只返回子节点,不包括TextNode节点(不管该节点是否有Text信息)。如果要获取该节点的Text信息,可以调用node.getText()方法,该方法返回节点的Text信息,也包括\n\t等特殊字符。
4、DOM4j同JDOM
/view/b091fe3f5727638b.html
/blog/668280
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:29158次
排名:千里之外
原创:23篇
(3)(1)(10)(6)(5)(1)java使用正则表达式,简单提取xml中的内容 - 奋斗一生 - ITeye技术网站
博客分类:
我们现在互联网的交互很少可以离开xml了。有时候需要的xml很小,除了内容以外,格式也都不变,那么再解析xml的时候就没必要使用那些解析xml的大家伙了。简单使用正则表达式来提交可以省去我们加载和学习那些东西的麻烦。
需要解析的xml数据如下。
&?xml version="1.0"
encoding="UTF-8" ?&
&pwd_message_list version="3.0"&
&message_type&SMS_MT&/message_type&
&msgid&-2027902&/msgid&
&newmsgid&0001&/newmsgid&
&mobile&&/mobile&
&gwid&bjyd&/gwid&
&spcode&159&/spcode&
&serviceType&&/serviceType&
&linkid&&/linkid&
&mtmsg&heheh59&/mtmsg&
&feeflag&1&/feeflag&
&cpproductID&123&cpproductID&
&msgfmt&15&/msgfmt&
&pktotal&1&/pktotal&
&pknumber&1&/pknumber&
&/message&
&msgid&-2027902&/msgid&
&newmsgid&0001&/newmsgid&
&mobile&&/mobile&
&gwid&bjyd&/gwid&
&spcode&159&/spcode&
&serviceType&&/serviceType&
&linkid&&/linkid&
&mtmsg&heheh59&/mtmsg&
&feeflag&1&/feeflag&
&cpproductID&123&cpproductID&
&msgfmt&15&/msgfmt&
&pktotal&1&/pktotal&
&pknumber&1&/pknumber&
&/message&
&/pwd_message_list&
处理代码如下:
public void split(String data)
data=data.toLowerCase();
ArrayList&SmsMt& smsMtList=new ArrayList&SmsMt&();
Pattern pile("&message&(.*?)&/message&");
Matcher matcher2=pattern2.matcher(data);
while(matcher2.find())
String data1=matcher2.group(i);
System.out.println(getParameter(data1,"mobile"));
System.out.println(getParameter(data1,"linkid"));
System.out.println(getParameter(data1,"mtmsg"));
System.out.println(getParameter(data1,"servicetype"));
public String getParameter(String data,String para)
String result="";
StringBuffer reStr=new StringBuffer();
reStr.append("&");
reStr.append(para);
reStr.append("&");
reStr.append("(.*?)");
reStr.append("&/");
reStr.append(para);
reStr.append("&");
Pattern pile(reStr.toString());
Matcher matcher=pattern.matcher(data);
if(matcher.find())
result=matcher.group(1);
将上面的xml文件,如果多行替换掉\r\n。然后使用split方法很容易取出&mobile&..&/mobile&&linkid&&/linkid&中的内容
浏览: 284306 次
来自: 北京
哇 curl实在是太强了
3Q~ 解决了!
zwwspace 写道这个方法好像搞不定啊怎么搞不定我就是这样 ...
这个方法好像搞不定啊}

我要回帖

更多关于 java解析soap的xml 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信