Java程序员从笨鸟到菜鸟之(二十七)XML之Jdom和DOM4J解析 .
jdom解析
JDOM是一种使用 XML 的独特 Java 工具包,用于快速开发 XML 应用程序。它的设计包含 Java 语言的语法乃至语义。 JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。(http://jdom.org)
JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念等),把SAX和DOM的功能有效地结合起来。 DOM是用Java语言读、写、操作XML的新API函数。在直接、简单和高效的前提下,这些API函数被最大限度的优化。 在使用设计上尽可能地隐藏原来使用XML过程中的复杂性。利用JDOM处理XML文档将是一件轻松、简单的事。 JDOM 主要用来弥补DOM及SAX在实际应用当中的不足之处。这些不足之处主要在于SAX没有文档修改、随机访问以及输出的功能,而对于DOM来说,JAVA程序员在使用时来用起来总觉得不太方便。 DOM的缺点主要是由于DOM是一个接口定义语言(IDL),它的任务是在不同语言实现中的一个最低的通用标准,并不是为JAVA特别设计的。 在 JDOM 中,XML 元素就是 Element 的实例,XML 属性就是 Attribute 的实例,XML 文档本身就是 Document 的实例.JDOM 是作为一种轻量级 API 被制定的,最主要的是它是以 Java 为中心的。它在遵循 DOM 主要规则的基础上除去了dom本身的缺点 。
因为 JDOM 对象就是像 Document、Element 和 Attribute 这些类的直接实例,因此创建一个新 JDOM 对象就如在 Java 语言中使用 new 操作符一样容易。JDOM 的使用是直截了当的。 JDOM 使用标准的 Java 编码模式。只要有可能,它使用 Java new 操作符而不使用复杂的工厂模式,使对象操作即便对于初学用户也很方便。
JDOM是由以下几个包组成的
–org.jdom包含了所有的xml文档要素的java类
–org.jdom.adapters包含了与dom适配的java类
–org.jdom.filter包含了xml文档的过滤器类
–org.jdom.input包含了读取xml文档的类
–org.jdom.output包含了写入xml文档的类
–org.jdom.transform包含了将jdomxml文档接口转换为其他xml文档接口
–org.jdom.xpath包含了对xml文档xpath操作的类
org.jdom这个包里的类是你解析xml文件后所要用到的所有数据类型。 –Attribute –CDATA –Coment –DocType –Document –Element –EntityRef –Namespace –ProscessingInstruction
–Text
Jdom主要使用方法:
1.Document类
Document的操作方法:
Element root = new Element("GREETING");
Document doc = new Document(root);
root.setText("Hello JDOM!");
或者简单的使用
Document doc=new Document(new Element("GREETING").setText("Hello JDOM!t"));
2.这点和DOM不同。Dom则需要更为复杂的代码,如下:
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder =factory.newDocumentBuilder(); Document doc = builder.newDocument(); Element root =doc.createElement("root"); Text text = doc.createText("This is the root"); root.appendChild(text); doc.appendChild(root);
3.可以使用SAXBuilder的build方法来解析一个流从而得到一个Document对象
–Document build(java.io.File file) –Document build(org.xml.sax.InputSource in) –Document build(java.io.InputStream in) –Document build(java.net.URL url)
4.DOM的Document和JDOM的Document之间的相互转换使用方法
DOMBuilder builder = new DOMBuilder(); org.jdom.Document jdomDocument = builder.build(domDocument); –DOMOutputter converter = new DOMOutputter();// work with the JDOM document… –org.w3c.dom.Document domDocument = converter.output(jdomDocument); –// work with the DOM document…
5.XMLOutPutter类:
JDOM的输出非常灵活,支持很多种io格式以及风格的输出
Document doc = new Document(...); XMLOutputter outp = new XMLOutputter(); outp.output(doc, fileOutputStream); // Raw output outp.setTextTrim(true); // Compressed output outp.output(doc, socket.getOutputStream()); outp.setIndent(" ");// Pretty output outp.setNewlines(true); outp.output(doc, System.out);
DOM4J解析
DOM4J 是dom4j.org 出品的一个开源XML解析包,它是一个易用的、开源的库,用于XML,XPath 和XSLT。它应用于Java 平台,采用了Java 集合框架并完全支持DOM,SAX 和JAXP。DOM4J 使用起来非常简单。只要你了解基本的XML-DOM 模型,就能使用。
它的主要接口都在org.dom4j 这个包里定义:
看名字大致就知道它们的涵义如何了。下面咱一一看一下:
一.Document对象,三种创建方法
1.读取XML文件,获得document对象.
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
2.解析XML格式的字符串,获得document对象.
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);
3.创建document空对象.
Document document = DocumentHelper.createDocument();
Element root = document.addElement("members");// 创建根节点,只有空DOCUMENT对象才能创建ROOT结点
二.节点控制
1.获取文档的根节点.
Element root = document.getRootElement();
2.取得节点的文本
String text=memberElm.getText();
也可以用:
String text=root.elementText("name"); //这个是取得根节点下的name字节点的文字;可以类推任何节点下的文本
3.设置节点文字.
ageElm.setText("29");
4.父节点下获得单个子节点对象.
Element memberElm=root.element("member"); // "member"是节点名
5.取得父节点下遍历名为"member"的所有子节点.
List nodes = rootElm.elements("member");
for (Iterator it = nodes.iterator(); it.hasNext();) {
Element elm = (Element) it.next();
// do something
}
6.父节点下的遍历所有子节点进行.
for(Iterator it=root.elementIterator();it.hasNext();){
Element element = (Element) it.next();
// do something
}
7.父节点下添加子节点.
Element ageElm = newMemberElm.addElement("age");
8.父节点下删除子节点.
parentElm.remove(childElm);// childElm是待删除的节点,parentElm是其父节点
三.属性相关.
1.取得某节点下的某属性
Element root=document.getRootElement();
Attribute attribute=root.attribute("size");// 属性名name
2.取得属性的文字
String text=attribute.getText();
也可以用:
String text2=root.element("name").attributeValue("firstname");这个是取得根节点下name字节点的属性firstname的值.
3.遍历某节点的所有属性
Element root=document.getRootElement();
for(Iterator it=root.attributeIterator();it.hasNext();){
Attribute attribute = (Attribute) it.next();
String text=attribute.getText();
System.out.println(text);
}
4.设置某节点的属性和文字.
newMemberElm.addAttribute("name", "sitinspring");
5.设置属性的文字
Attribute attribute=root.attribute("name");
attribute.setText("sitinspring");
6.删除某属性
Attribute attribute=root.attribute("size");// 属性名name
root.remove(attribute);
四.将文档写入XML文件.
1.文档中全为英文,不设置编码,直接写入的形式.
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
2.文档中含有中文,设置编码格式写入的形式.
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK"); // 指定XML编码
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
writer.write(document);
writer.close();
五.字符串与XML的转换
1.将字符串转化为XML
String text = "<members> <member>sitinspring</member> </members>";
Document document = DocumentHelper.parseText(text);
2.将文档或节点的XML转化为字符串.
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
Element root=document.getRootElement();
String docXmlText=document.asXML();
String rootXmlText=root.asXML();
Element memberElm=root.element("member");
String memberXmlText=memberElm.asXML();
六.使用XPath快速找到节点.
读取的XML文档示例
<?xml version="1.0" encoding="UTF-8"?> <projectDescription> <name>MemberManagement</name> <comment></comment> <projects> <project>PRJ1</project> <project>PRJ2</project> <project>PRJ3</project> <project>PRJ4</project> </projects> <buildSpec> <buildCommand> <name>org.eclipse.jdt.core.javabuilder</name> <arguments> </arguments> </buildCommand> </buildSpec> <natures> <nature>org.eclipse.jdt.core.javanature</nature> </natures> </projectDescription>
使用XPath快速找到节点project.
public static void main(String[] args){ SAXReader reader = new SAXReader(); try{ Document doc = reader.read(new File("sample.xml")); List projects=doc.selectNodes("/projectDescription/projects/project"); //Element nodes0=xmlDoc.selectSingleNode("/bookstore"); //采用相对路径,即当前结点(包括当前结点)开始查找,与下列结果相同. //Element nodes=nodes0.selectNodes("book"); ////采用绝对路径,即当前结点(包括当前结点)开始查找, //XPATH语法详见: http://www.w3school.com.cn/xpath/xpath_syntax.asp Iterator it=projects.iterator(); while(it.hasNext()){ Element elm=(Element)it.next(); System.out.println(elm.getText()); } } catch(Exception ex){ ex.printStackTrace(); } }
推荐阅读:
Java程序员从笨鸟到菜鸟之(二十九)javascript对象的创建和继承实现
Java程序员从笨鸟到菜鸟之(二十八)Javascript总结之语言基础
转载于:https://blog.51cto.com/javacsh/1129160
上一篇: Android利用zxing生成二维码