四种方法解析XML文档:Dom、SAX、JDOM、dom4j
1、了解XML:
XML,即可扩展标记语言(ExtensibleMarkupLanguage),标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的标记语言。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。它和JSON都是一种数据交换格式。
作用:解析XML文档,创建XML文档。
2、什么是可扩展标记语言?
·可扩展标记语言是一种很像超文本标记语言的标记语言。
·它的设计宗旨是传输数据,而不是显示数据。
·它的标签没有被预定义。您需要自行定义标签。
·它被设计为具有自我描述性。
·它是W3C的推荐标准。
3、解析XML文档的四种方式:四种方法解析XML文档:Dom、SAX、JDOM、dom4j
第一种:DOM的全称是DocumentObjectModel,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
第一种:DOM的XML文件读取:
1.DocumentBuilderFactory.newInstance()创建DocumentBuilderFactory的对象
2.DocumentBuilder获得具体的DOM解析器。
3.Parse(newFile())获取文档xml路径。
—————看注释
准备XML文档:
@H_972_301@ <?xmlversion="1.0"encoding="UTF-8"?>
- <Languagescat="it">
@H_972_301@ <lanid="1">
- <name>Java</name>
@H_972_301@ <ide>Eclipse</ide>
- </lan>
@H_972_301@ <lanid="2">
- <name>Swift</name>
@H_972_301@ <ide>Xcode</ide>
- <lanid="3">
- <name>C#</name>
@H_972_301@ <ide>VisualStudio</ide>
- </Languages>
看看DOM解析的例子:
copy
packagedom;
importjava.io.File;
importjava.io.IOException;
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.ParserConfigurationException;
importorg.w3c.dom.Document;
importorg.w3c.dom.Element;
importorg.w3c.dom.Node;
importorg.w3c.dom.NodeList;
importorg.xml.sax.SAXException;
*
*/
publicclassReaderXML{
staticvoidmain(String[]args){
try{
//1。获取DOM解析器的工厂实例。
DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
//2。获得具体的DOM解析器。
DocumentBuilderbuilder=factory.newDocumentBuilder();
//3。获取文件
Documentdocument=builder.parse(newFile("languages.xml"));
//4。获取根元素
Elementroot=document.getDocumentElement();
System.out.println("cat="+root.getAttribute("cat"));
//5。获取根节点[有多个节点]
NodeListlist=root.getElementsByTagName("lan");
for(inti=0;i<list.getLength();i++){
//Nodelan=list.item(i);
//System.out.println("id="+lan.getNodeType());
System.out.println("---------------");
Elementlan=(Element)list.item(i);
System.out.println("id="+lan.getAttribute("id"));
//获取子节点集合
NodeListclist=lan.getChildNodes();
intj=0;j<clist.getLength();j++){
//获取下标
Nodec=clist.item(j);
//把空格删除[获取属性名和值]
if(cinstanceofElement){
System.out.println(c.getNodeName()+"="+c.getTextContent());
}
}
}catch(ParserConfigurationExceptione){
e.printStackTrace();
catch(SAXExceptione){
catch(IOExceptione){
}
第一种:DOM的XML文件创建:
1.DocumentBuilderFactory.newInstance()获取DOM解析器的工厂实例。
2.DocumentBuilder获得具体的DOM解析器。
3.创建一个xml文档,获得Document对象(根结点)(createElement)。
4.创建根元素、根结点、setAttribute("根结点名");
5.添加根节点的值:setTextContent(“Value”);
6.子节点添加到根节点:appendChild(“根结点”);
7.输出:TransformerFactory!
copy
importjava.io.File;
importjava.io.StringWriter;
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.ParserConfigurationException;
importjavax.xml.transform.Transformer;
importjavax.xml.transform.TransformerException;
importjavax.xml.transform.TransformerFactory;
importjavax.xml.transform.dom.DOMSource;
importjavax.xml.transform.stream.StreamResult;
/*
*DOMClassGreat
*
*/
classCreat_XML{
voidmain(String[]ags){
DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
Documentdocument=builder.newDocument();
//创建属性名、赋值
Elementroot=document.createElement("Languages");
root.setAttribute("cat","it");
//创建第一个根节点、赋值
Elementlan=document.createElement("lan");
lan.setAttribute("id","1");
Elementname=document.createElement("name");
name.setTextContent("java");
Elementide=document.createElement("IDE");
ide.setTextContent("Eclipse");
lan.appendChild(name);
lan.appendChild(ide);
<spanstyle="font-size:14px;"></span><prename="code"class="java">
Elementlan2=document.createElement("lan");
lan2.setAttribute("id","2");
Elementname2=document.createElement("name");
name2.setTextContent("Swift");
Elementide2=document.createElement("ide");
ide2.setTextContent("XCode");
lan2.appendChild(name2);
lan2.appendChild(ide2);
//添加到属性中、
root.appendChild(lan);
root.appendChild(lan2);
document.appendChild(root);
//定义了用于处理转换指令,以及执行从源到结果的转换的
TransformerFactorytransformerFactory=TransformerFactory.newInstance();
Transformertransformer=transformerFactory.newTransformer();
transformer.setOutputProperty("encoding","UTF-8");
StringWriterwriter=newStringWriter();
transformer.transform(newDOMSource(document),newStreamResult(writer));
System.out.println(writer.toString());
transformer.transform(newStreamResult(newFile("newxml.xml")));
catch(ParserConfigurationException|TransformerExceptione){
}
第二种:dom4j是一个Java的XMLAPI,类似于jdom,用来读写XML文件的,dom4j是一个十分优秀的JavaXMLAPI,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBMdeveloperWorks上面还可以找到一篇文章,对主流的JavaXMLAPI进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包,Hibernate也用它来读写配置文件。
下载:dom4j架包
第二种:Dom4j创建XML步骤:
1.设置根节点:DocumentHelper.createElement("根节点名");
2.读取doucment元素:DocumentHelper.createDocument(root);
3.添加根节点:addAttribute("name","value");
4.添加字节点、赋值:addElement("name");setText("value");
5.添加到根节点:XMLWriterxmlWriter=newXMLWriter();xmlWriter.write(document);
copy
packagedom4j;
importjava.io.FileOutputStream;
importorg.dom4j.Document;
importorg.dom4j.DocumentHelper;
importorg.dom4j.Element;
importorg.dom4j.io.OutputFormat;
importorg.dom4j.io.XMLWriter;
classGreate_dom4j{
voidmain(String[]args)throwsException
{
//创建文档并设置文档的根元素节点
Elementroot=DocumentHelper.createElement("books");
Documentdoucment=DocumentHelper.createDocument(root);
//根节点
root.addAttribute("name","bookvalue");
//子节点
Elementelement1=root.addElement("author1");
element1.addAttribute("name","James1");
element1.addAttribute("location1","UK1");
element1.addText("JamesStrachan1");
Elementelement=root.addElement("author2");
element.addAttribute("name","chen");
element.addAttribute("kenken","ZK");
element.addText("chenkenken");
//添加
XMLWriterxmlwriter2=newXMLWriter();
xmlwriter2.write(doucment);
//创建文件
OutputFormatformat=newOutputFormat();
FileOutputStreamfile=newFileOutputStream("books.xml");
XMLWriterxml=newXMLWriter(file);
xml.close();
}
第二种:om4j读取XML步骤:
1.获取SAM接口:SAXReadersaxReader=newSAXReader();
2.获取XML文档:Documentdoc=saxReader.read(newFile("name.xml"));
3.获取根节点:Elementroot=doc.getRootElement();
4.获取子节点:root.elementIterator();
5.获取孙节点:attributeIterator();
copy
importjava.util.Iterator;
importjava.util.List;
importorg.dom4j.Attribute;
importorg.dom4j.Document;
importorg.dom4j.io.SAXReader;
*dom4jClassReader
classRreader_dom4j{
throwsException{
//1.获取SAM接口:
SAXReadersaxReader=newSAXReader();
//2.获取XML文件:
Documentdoc=saxReader.read(newFile("newxml.xml"));
//3.获取根节点:
Elementroot=doc.getRootElement();
System.out.println("根节点:"+root.getName());
System.out.println("----------------");
//获取子节点
Iterator<?>it=root.elementIterator();
while(it.hasNext()){
Elementelem=(Element)it.next();
//获取属性名属性值
List<Attribute>li=elem.attributes();
for(Attributeatt:li){
System.out.println(att.getName()+""+att.getValue());
//获取子节的子节点
Iterator<?>ite=elem.elementIterator();
while(ite.hasNext()){
Elementchild=(Element)ite.next();
System.out.println(child.getName()+""+child.getStringValue());
System.out.println("----------------");
第三种:JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。JDOM直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念等),把SAX和DOM的功能有效地结合起来。
JDOM是用Java语言读、写、操作XML的新API函数。在直接、简单和高效的前提下,这些API函数被最大限度的优化。
JDOM读取XML:
copy
packagecom.jdom;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.UnsupportedEncodingException;
importjava.util.List;
importorg.jdom2.Attribute;
importorg.jdom2.Document;
importorg.jdom2.Element;
importorg.jdom2.JDOMException;
importorg.jdom2.input.SAXBuilder;
/**
*JDOMClassReader
classReaderJDom{
try{
//1.创建一个SAXBuilder的对象
SAXBuildersaxBuilder=newSAXBuilder();
//2.创建一个输入流,将xml文件加载到输入流中
InputStreamin=newFileInputStream("Book.xml");
InputStreamReaderisr=newInputStreamReader(in,0); background-color:inherit">//3.通过saxBuilder的build方法,将输入流加载到saxBuilder中
Documentdocument=saxBuilder.build(isr);
//4.通过document对象获取xml文件的根节点
ElementrootElement=document.getRootElement();
//5.获取根节点下的子节点的List集合
List<Element>elementList=rootElement.getChildren();
for(Elementelement:elementList){
//解析文件的属性集合
List<Attribute>list=element.getAttributes();
for(Attributeattr:list){
//获取属性名
StringattrName=attr.getName();
//获取属性值
StringattrValue=attr.getValue();
System.out.println(attrName+"="+attrValue);
//对book节点的子节点的节点名以及节点值的遍历
List<Element>listChild=element.getChildren();
for(Elementchild:listChild){
System.out.println(child.getName()+"="+child.getValue());
System.out.println("——————————————————————");
}catch(FileNotFoundExceptione){
e.printStackTrace();
catch(UnsupportedEncodingExceptione){
catch(JDOMExceptione){
catch(IOExceptione){
JDOM创建xml:
copy
importjava.io.IOException;
importorg.jdom2.Document;
importorg.jdom2.Element;
importorg.jdom2.output.Format;
importorg.jdom2.output.XMLOutputter;
*CreateClass
classCreateJDom{
//1.生成一个根节点
@H_972_
301@
ElementRSS=newElement("Languages");
//2.为节点添加属性
@H_972_
301@
RSS.setAttribute("Cat",0); background-color:inherit">//3.生成一个document对象
@H_972_
301@
Documentdocument=newDocument(RSS);
//添加元素
Elementlan=newElement("lan");
Elementname=newElement("name");
@H_972_
301@
name.setText("java");
lan.addContent(name);
ElementIDE=newElement("IDE");
@H_972_
301@
IDE.setText("eclipse");
lan.addContent(IDE);
@H_972_
301@
RSS.addContent(lan);
Elementlan2= lan2.setAttribute("id",108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> Elementname2= name2.setText("C#");
lan.addContent(name2);
ElementIDE2= IDE2.setText("VisualStudio");
lan2.addContent(IDE2);
@H_972_
301@
RSS.addContent(lan2);
//格式换行、编码
@H_972_
301@
Formatformat=Format.getCompactFormat();
format.setIndent("");
@H_972_
301@
format.setEncoding("GBK");
//4.创建XMLOutputter的对象
XMLOutputteroutputer=newXMLOutputter(format);
//5.利用outputer将document对象转换成xml文档
outputer.output(document,newFileOutputStream(newFile("Booknews.xml")));
第四种:SAX的全称是SimpleAPIsforXML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。 原文链接:https://www.f2er.com/xml/294807.html