2024年3月5日发(作者:)

xml的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J)

第二种:DOM解析

DOM中的核心概念就是节点。DOM在分析XML文档时,将将组成XML文档的各个部分(元素、属性、文本、注释、处理指令等)映射为一个对象(节点)。在内存中,这些节点形成一课文档树。整棵树是一个节点,树中的每一个节点也是一棵树(子树),可以说,DOM就是对这棵树的一个对象描述,我们通过访问树中的节点来存取XML文档的内容。

PS:属性节点是附属于元素的,不能被看做是元素的子节点,更不能作为一个单独的节点

Java代码

import nt;

import odeMap;

import ;

import ser;

public class DOMPrinter

{

public static void main(String[] args)

{

try

{

/** *//** 获取Document对象 */

DOMParser parser = new DOMParser();

("");

Document document = ument();

printNode(document);

} catch (Exception e)

{

tackTrace();

}

}

public static void printNode(Node node)

{

short nodeType=eType();

switch(nodeType)

{

case SING_INSTRUCTION_NODE://预处理指令类型

printNodeInfo(node);

break;

case T_NODE://元素节点类型

printNodeInfo(node);

printAttribute(node);

break;

case _NODE://文本节点类型

printNodeInfo(node);

break;

default:

break;

}

Node child=stChild();

while(child!=null)

{

printNode(child);

child=tSibling();

}

}

/** *//**

* 根据节点类型打印节点

* @param node

*/

public static void printNodeInfo(Node node)

{

if (eType() == T_NODE)

{

n("NodeName: " + eName());

}

else if (eType() == _NODE)

{

String value = eValue().trim();

if (!(""))

n("NodeValue: " + value);

else

n();

}else

{

n(eName()+" : "+eValue());

}

}

/** *//**

* 打印节点属性

* @param aNode 节点

*/

public static void printAttribute(Node aNode)

{

NamedNodeMap attrs = ributes();

if(attrs!=null)

{

for (int i = 0; i < gth(); i++)

{

Node attNode = (i);

n("Attribute: " + eName() + "="" + eValue()+""");

}

}

}

DOM生成XML文档:

Java代码

import tFoundException;

import tputStream;

import ption;

import ntBuilder;

import ntBuilderFactory;

import ConfigurationException;

import nt;

import t;

import ializer;

public class DOMCreateExample

{

public static void main(String[] args) throws ParserConfigurationException

{

//DOMImplementation domImp = Implementation();

DocumentBuilderFactory builderFact = tance();

DocumentBuilder builder = umentBuilder();

Document doc = ument();

//Document doc = Document(null, null, null);

Element root = Element("games");

Element child1 = Element("game");

Child(TextNode("Final Fantasy VII"));

ribute("genre", "rpg");

Child(child1);

Child(root);

XMLSerializer serial;

try

{

serial = new XMLSerializer(new FileOutputStream(""), null);

ize(doc);

} catch (FileNotFoundException e1)

{

tackTrace();

} catch (IOException e)

{

tackTrace();

}

}

}

第三种JDOM解析

JDOM利用了java语言的优秀特性,极大地简化了对XML文档的处理,相比DOM简单易用。JDOM也使用对象树来表示XML文档,JDOM使用SAXj解析器来分析XML文档,构建JDOM树。然而JOMD本身并没有提供解析器,它使用其他开发商提供的标准SAX解析器,JDOM默认通过JAXP来选择解析器,可以通过手动知道解析器的类名来设置。

首先要在工程中添加jdom的jar包,这里使用。(见附件)

Java代码

import ;

import nt;

import t;

import lder;

import ;

import putter;

public class JDOMConvert

{

public static void main(String[] args)

{

SAXBuilder saxBuilder=new SAXBuilder();

try

{

Document doc=(new File(""));

//首先创建好节点

Element eltDb=new Element("db");

Element eltDriver=new Element("driver");

Element eltUrl=new Element("url");

Element eltUser=new Element("user");

Element eltPassword=new Element("password");

//设置节点的值

t("");

t("jdbc:mysql://localhost/mySql");

t("root");

t("xlc");

//添加到根节点

tent(eltDriver);

tent(eltUrl);

tent(eltUser);

tent(eltPassword);

//根节点设置属性

ribute("type","mysql");

Element root=tElement();

//Child("db");//删除节点

tent(eltDb);//增加节点

//修改db节点中内容

ld("db").getChild("user").setText("system");

ld("db").getChild("password").setText("manager");

XMLOutputter xmlOut=new XMLOutputter();

//设置XML格式

Format fmt=ttyFormat();

ent(" ");

oding("utf-8");

mat(fmt);

(doc,);

}

catch (Exception e)

{

tackTrace();

}

}

}

JDOM生成XML文档:

Java代码

import ption;

import nt;

import t;

import putter;

public class JDOMCreate

{

public static void main(String[] args)

{

Document doc = new Document(new Element("games"));

Element newGame = new Element("game").setText("Final Fantasy VI");

tElement().addContent(newGame);

ribute("genre", "rpg");

XMLOutputter domstream = new XMLOutputter();

try

{

(doc, );

} catch (IOException e)

{

tackTrace();

}

}

}

第四种:DOM4J解析

dom4j与JDOM一样,也是一种用于解析XML文档的开放源代码的XML框架,dom4j也应用于java平台,dom4j API使用了java集合框架并完全支持DOM、SAX和JAXP。与JDOM不同的是,dom4j使用接口和抽象类,虽然dom4j的API相对复杂些,但它提供了比JDOM更好的灵活性。dom4j也使用SAX解析器来分析XML文档,创建dom4j树。此外dom4j也可以接收DOM格式的内容,并提供了从dom4j树到SAX事件流或W3C DOM树的输出机制。与JDOM不同,dom4j自带了一个SAX解析器Aelfred2,如果没有显示的设置SAX解析器,也没有通过系统属性设置解析器,dom3j将会使用JAXP来加载JAXP配置的解析器,如果创建解析器失败,那么最后才使用dom4j自带的Aelfred2解析器。

同样,首先要在工程中添加dom4j的jar包,这里使用。(见附件)

Dom4j生成XML文档:

Java代码

import ption;

import nt;

import ntHelper;

import t;

import Format;

import ter;

public class Dom4jCreate

{

public static void main(String[] args)

{

Document doc = Document();

cessingInstruction("xml-stylesheet", "type='text/xsl' href=''");

Type("dbconfig", null,"");

//Element root=Element("dbconfig");

// tElement(root);

Element root = ment("dbconfig");

Element eltDb= ment("db");

Element eltDriver = ment("driver");

Element eltUrl = ment("url");

Element eltUser = ment("user");

Element eltPassword = ment("password");

t("");

t("jdbc:mysql://localhost/mySql");

t("root");

t("xlc");

ribute("type","mysql");

try

{

//设置输出格式

OutputFormat outFmt = new OutputFormat(" ", true);

oding("UTF-8");

/**//*PrintWriter pw = new PrintWriter();

(pw);

();

();*/

XMLWriter xmlWriter = new XMLWriter(, outFmt);

// XMLWriter xmlWriter=new XMLWriter(new FileWriter(""),outFmt);

(doc);

();

();

} catch (IOException e)

{

tackTrace();

}

}

}

Dom4j修改XML文档:

Java代码

import ;

import iter;

import or;

import ;

import nt;

import t;

import Format;

import der;

import ter;

public class Dom4jModify

{

public Document modifyDocument(File inputXml)

{

try

{

SAXReader saxReader = new SAXReader();

Document document = (inputXml);

Type("dbconfig",null,"");

List list = t();

// Iterator iter = erator();

Iterator iter = or();

Element element = (Element) ();

t("db").attribute("type").setValue("mysql");

t("db").element("url").setText("jdbc:mysql://localhost/mySql");

t("db").element("driver").setText("");

t("db").element("user").setText("root");

t("db").element("password").setText("xlc");

// 设置输出格式

OutputFormat outFmt = new OutputFormat(" ", true);

oding("UTF-8");

XMLWriter xmlWriter=new XMLWriter(new FileWriter(""),outFmt);

(document);

();

();

return document;

}

catch (Exception e)

{

n(sage());

return null;

}

}

public static void main(String[] args) throws Exception

{

Dom4jModify dom4jParser = new Dom4jModify();

Document document = Document(new File(""));

OutputFormat outFmt = new OutputFormat(" ", true);

oding("UTF-8");

XMLWriter xmlWriter = new XMLWriter(,outFmt);

(document);

();

();

}

}