加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml解析

发布时间:2020-12-16 00:14:33 所属栏目:百科 来源:网络整理
导读:XML解析 DOM(Document Object Model)解析 优点:增删改查方便 缺点:需要读取整个xml才能构建DOM树。对于较大的xml,容易内存溢出 SAX(Simple API for XML)解析 优点:在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作 缺

XML解析

DOM(Document Object Model)解析

优点:增删改查方便

缺点:需要读取整个xml才能构建DOM树。对于较大的xml,容易内存溢出

SAX(Simple API for XML)解析

优点:在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作

缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素

适用于只查询


JAXP(Java API for XML Processing)

可以进行DOM解析和SAX解析,由SUN公司提供,存在于JDK中

所在包:

org.w3c.dom:提供DOM方式解析XML的标准接口

org.xml.sax:提供SAX方式解析XML的标准接口

javax.xml:提供了解析XML文档的类

JAXP调用dom方式创建xml

创建一个如下所示的xml文件

<?xmlversion="1.0"encoding="UTF-8"?>
<recipetype="dessert">
<recipenamecuisine="american"servings="1">IceCreamSundae</recipename>
</recipe>

java代码如下:

publicstaticvoidcreateXML(StringfileName)throwsException{
//获取DocumentBuilderFactory
DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
//获取DocumentBuilder
DocumentBuilderbuilder=factory.newDocumentBuilder();
	//获取Document对象
	Documentdocument=builder.newDocument();
	//设置xml声明
	document.setXmlStandalone(false);//指定此文档是否是单独的的属性
	//创建跟元素<recipetype="dessert">
	ElementrootElement=document.createElement("recipe");
	//设置元素属性
	rootElement.setAttribute("type","dessert");
	//创建元素<recipename>
	Elementrecipename=document.createElement("recipename");
	//为recipename元素添加属性
	recipename.setAttribute("cuisine","american");
	recipename.setAttribute("servings","1");
	//设置recipename元素中的值
	recipename.setTextContent("IceCreamSundae");
	rootElement.appendChild(recipename);
	//将根元素添加到document中
	document.appendChild(rootElement);
		
		
	//将xml映射到文件
	booleanflag=true;
	try{
	//获取TransformerFactorty用于创建Transformer和Templates对象。
	TransformerFactorytf=TransformerFactory.newInstance();
	//获取Transformer对象处理来自不同源的XML,并将转换输出写入各种接收器
	//注意:在多线程同时运行时不能使用此类的对象
	Transformertransformer=tf.newTransformer();
	DOMSourcesource=newDOMSource(document);
	//设置编码格式
	transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
	//设置indent="yes"|"no".indent指定了当输出结果树时,Transformer是否可以添加额外的空白;其值必须为yes或no。就是幽默诶有进行格式化
	transformer.setOutputProperty(OutputKeys.INDENT,"yes");
	PrintWriterpw=newPrintWriter(newFileOutputStream(fileName));
	StreamResultresult=newStreamResult(pw);
	transformer.transform(source,result);
}catch(Exceptione){
	flag=false;
	e.printStackTrace();
	}
	if(flag){
	System.out.println("生成XML文件成功!");
	}else{
	System.out.println("生成XML文件失败!");
	}
	}

JAXP调用SAX解析XML

publicstaticvoidmain(String[]args)throwsParserConfigurationException,SAXException,IOException{
		//创建解析器工厂,
		SAXParserFactoryspf=SAXParserFactory.newInstance();
		//得到解析器,
		SAXParserparser=spf.newSAXParser();
		//得到读取器
		XMLReaderreader=parser.getXMLReader();
		//给内容注册内容处理器
//		reader.setContentHandler(newMyContentHandler());
		reader.setContentHandler(newDefaultHandler(){
			publicvoidstartDocument()throwsSAXException{
				//TODOAuto-generatedmethodstub
				super.startDocument();
				System.out.println("读取文档开始");
			}
			publicvoidendDocument()throwsSAXException{
				//TODOAuto-generatedmethodstub
				super.endDocument();
				System.out.println("读取文档结束");
			}
		});
		//解析文档
		reader.parse("book.xml");
}

由于dom用来增删改比较方便,所以选择了用期进行创建修改操作,而SAX方式可以快速的进行查找便利,所以选择用来做解析遍历,此处就不在编写dom解析xml的方式了。


第三方解析XML--DOM4J

解析XML,对XML进行遍历

首先要获取到一个Document对象

publicDocumentparse(URLurl)throwsDocumentException{
SAXReaderreader=newSAXReader();
Documentdocument=reader.read(url);
returndocument;
}

然后开始进行遍历,在文档中找到两种方法见代码:

//方法1
publicvoidbar(Documentdocument)throwsDocumentException{

Elementroot=document.getRootElement();

//iteratethroughchildelementsofroot
for(Iteratori=root.elementIterator();i.hasNext();){
Elementelement=(Element)i.next();
//dosomething
}

//iteratethroughchildelementsofrootwithelementname"foo"
for(Iteratori=root.elementIterator("foo");i.hasNext();){
Elementfoo=(Element)i.next();
//dosomething
}

//iteratethroughattributesofroot
for(Iteratori=root.attributeIterator();i.hasNext();){
Attributeattribute=(Attribute)i.next();
//dosomething
}
}
//方法2
publicvoidtreeWalk(Documentdocument){
treeWalk(document.getRootElement());
}

publicvoidtreeWalk(Elementelement){
for(inti=0,size=element.nodeCount();i<size;i++){
Nodenode=element.node(i);
if(nodeinstanceofElement){
treeWalk((Element)node);
}
else{
//dosomething....
}
}
}

在文档中表明:如果说xml文件比较大的话,建议用第二种方法,可以避免了创建每个循环迭代器对象的成本。


Dom4j创建xml

/**
*创建XML
*/
publicDocumentcreateDocument(){
Documentdocument=DocumentHelper.createDocument();
Elementroot=document.addElement("root");

Elementauthor1=root.addElement("author")
.addAttribute("name","James")
.addAttribute("location","UK")
.addText("JamesStrachan");

Elementauthor2=root.addElement("author")
.addAttribute("name","Bob")
.addAttribute("location","US")
.addText("BobMcWhirter");

returndocument;
}
/**
*将XML进行持久化(保存到文件)
*/
publicvoidwrite(Documentdocument)throwsIOException{

XMLWriterwriter=newXMLWriter(
newFileWriter("output.xml")
);
writer.write(document);
writer.close();


/*这个地方是定义输出格式
*OutputFormat.createPrettyPrint()方便阅读的格式(带空格,带换行)
*OutputFormat.createCompactFormat();没有空格换行
*format.setEncoding(Stringencoding)可以设置编码格式,默认utf-8
*/
OutputFormatformat=OutputFormat.createPrettyPrint();
writer=newXMLWriter(System.out,format);
writer.write(document);
}

以上dom4j代码摘自文档中

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读