专业IT网络知识平台,分享IT百科知识、生活百科知识解答!

易企推科技
易企推科技

xml文件怎么打开(xml文件的解析)

来源:小易整编  作者:小易  发布时间:2020-03-27 07:55
摘要:xml文件怎么打开(xml文件的解析)1. 解析方式 1. 有两种解析方式,分别是: DOM:即Document Object Model,文档对象模型,W3C推出的专门用于解析xml一种处理方式 SAX:Simple API for XML,一个开源社区推出的xml解析方式。 区别是: DOM方式会将整个xml文件解析成为...

xml文件怎么打开(xml文件的解析)1. 解析方式

1. 有两种解析方式,分别是:

  • DOM:即Document Object Model,文档对象模型,W3C推出的专门用于解析xml一种处理方式
  • SAX:Simple API for XML,一个开源社区推出的xml解析方式。

区别是:

  • DOM方式会将整个xml文件解析成为一个树状结构,并加载到内存中,这种方式有一个缺点,如果xml文档过大,则解析会非常缓慢,甚至会产生内存溢出,优点就是因为在内存中生成了一个树状结构,所以可以对任意节点元素进行增删改操作。
  • SAX方式则是一边读一边解析,读到那个节点元素就解析那个,基于事件驱动,优点就是查询速度快而且不会发生内存溢出,缺点就是无法进行增删改操作。

2. xml解析开发包:这三个解析包均支持DOM和SAX两种方式解析xml文件

  • JAXP:由sun公司推出的解析包,是JavaSE中的一部分,有以下几个包及其子包构成
  • org.w3c.dom:提供了以DOM方式解析xml文件的标准接口
  • org.xml.sax:提供了以SAX方式解析XML文件的标准接口
  • javax.xml:提供了解析XML文件的类,在javax.xml.parsers包中有几个工厂类,通过工厂类就可以获得以DOM方式或SAX方式解析XML文件解析器对象,分别是javax.xml.parsers.DocumentBuilderFactory 工厂类和 javax.xml.parsers.SAXParserFactory工厂类
  • Dom4J:由一个开源组织开发的解析实现包,常用这个包进行XML文件解析。
  • JDom:也是一个开源组织开发的解析包

2. 通过JDK中的解析器以DOM方式进行XML文件解析的实现代码

1. 基础实现

import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
 * @ClassName:Demo1
 * @Description:使用jdk中提供的包以DOM方式解析xml文件,代码步骤如下
 */
public class Demo1 {
	public static void main(String[] args) {
		try {
			//1. 获取解析器的工程类对象DocumentBuilderFactory
			DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
			//2. 通过工厂类获取DOM解析器对象
			DocumentBuilder docb=domfac.newDocumentBuilder();
			//3. 解析指定路径的xml文件,并返回一个Document对象,Document对象中保存着整个xml文件中所有的元素节点
			Document doc=docb.parse("url");
			//4. 依据节点元素的名称来获取节点元素,返回的是一个NodeList对象
			NodeList list= doc.getElementsByTagName("name");
			//5. 从NodeList对象中遍历获取节点元素Node对象
			for(int i=0;i<list.getLength();i++){
				Node node= list.item(i);
				//6. 通过Node对象来获取节点内的具体信息,或者进行增删改当前节点及子节点操作
				System.out.println(node.getTextContent());;//获取当前节点中的文本数据
			}
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

2. 添加子节点和删除子节点

import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class Demo2 {
	public static void main(String[] args) {
		try {
			//1. 获取解析器的工程类对象DocumentBuilderFactory
			DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
			//2. 通过工厂类获取DOM解析器对象
			DocumentBuilder docb=domfac.newDocumentBuilder();
			//3. 解析指定路径的xml文件,并返回一个Document对象,Document对象中保存着整个xml文件中所有的元素节点
			Document doc=docb.parse("url");
			//4. 创建节点元素对象,并添加文本内容
			Element e=doc.createElement("节点元素名称");
			e.setTextContent("文本内容");
			//5. 依据节点元素的名称来获取节点元素,返回的是一个NodeList对象
			NodeList list= doc.getElementsByTagName("name");
			//6. 从NodeList对象中遍历获取节点元素Node对象
			for(int i=0;i<list.getLength();i++){
				Node node= list.item(i);
				//7. 通过Node对象来获取节点内的具体信息,或者进行增删改当前节点及子节点操作
				System.out.println(node.getTextContent());;//获取当前节点中的文本数据
				//8. 添加子节点
				node.appendChild(e);
								
				//删除当前节点
				/*
				Node parent=node.getParentNode();
				parent.removeChild(node);
				*/
			}
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

3. Document对象中数据的回写:当对xml文件解析成Document对象后,对Document对象进行修改后,需要回写到xml文件

import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
 * @ClassName:Demo3
 * @Description:通过javax.xml.transform.Transformer类将内存中的树形结构的DOM数据回写到文件中进行保存
 */
public class Demo3 {
	public static void main(String[] args) {
		try {
			DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
			DocumentBuilder docb=domfac.newDocumentBuilder();
			Document doc=docb.parse("url");
			NodeList list= doc.getElementsByTagName("name");
			//进行增删改修改元素节点,然后回写,比如修改某个节点的文本内容
			list.item(0).setTextContent("新文本内容");
			/*
			 * 数据回写代码
			 */
			//首先获取javax.xml.transform.Transformer类
			TransformerFactory transformerFactory=TransformerFactory.newInstance();
			Transformer trans=transformerFactory.newTransformer();
			//绑定要回写的Document对象
			DOMSource doms=new DOMSource(doc);
			//指定要回写到哪个xml文件中,参数写系统绝对路径或相对于当前类文件的相对路径
			//或者是一个File类型的对象,也可以是一个输出流对象
			StreamResult sr=new StreamResult("url");
			//进行回写
			trans.transform(doms, sr);
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}	
}

4. 对解析xml文件生成Document对象以及将Document对象进行回写封装可以成为一个工具类:

import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
/**
 * @ClassName:MyDomUtil
 * @Description:解析xml文件以及部分处理操作的封装类
 */
public class MyDomUtil {
	//获取解析指定xml文件得到的Document对象
	public static Document readDocument(String url) throws ParserConfigurationException, SAXException, IOException{
		DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
		DocumentBuilder docb=domfac.newDocumentBuilder();
		Document doc=docb.parse(url);
		return doc;
	}
	//向磁盘中的文件回写Document对象中的数据,url指定文件所在的路径,doc指定要回写的Document对象
	public static void writeDocument(String url,Document doc) throws TransformerException{
		TransformerFactory fac=TransformerFactory.newInstance();
		Transformer trans=fac.newTransformer();
		DOMSource dom=new DOMSource(doc);
		StreamResult sr=new StreamResult(url);
		trans.transform(dom, sr);
	}
	
}

3. 通过JDK中的解析器以SAX方式进行XML文件解析的实现代码

1. SAX原理:SAX采用事件处理的方式解析XML文件,主要是两个部分进行解析,分别是解析器和事件处理器。

  • 在创建解析器时,需要绑定一个事件处理器,该事件处理器类中的方法是对每一个标签进行处理的逻辑
  • 解析器每读到XML文件中某个标签的某一部分,都会调用事件处理器类中的某一个对应解析该部分的方法进行处理,将标签该部分的数据作为参数传入方法中,然后通过方法中的逻辑进行处理。
  • 事件处理器由可以使用默认的org.xml.sax.helpers.DefaultHandler类,但如果要实现自己的处理逻辑,就必须继承该类,然后重写其中的部分方法来实现自己的逻辑,获取标签数据并对数据进行处理。

注意,SAX方式解析xml文件不能对标签元素进行增删改操作,只能查询。

xml文件的解析

2. 代码实现:

import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
 * @ClassName:Demo4
 * @Description:以SAX方式解析xml文件
 */
public class Demo4 {
	public static void main(String[] args) {
		try {
			//获取解析器
			SAXParserFactory fac=SAXParserFactory.newInstance();//解析器工厂
			SAXParser saxp=fac.newSAXParser();//解析器
			//解析XML文件,对于事件处理器需要由自己设计实现
			saxp.parse("url", new MyHandler());
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}
/**
 * @ClassName:MyHandler
 * @Description:重写事件处理器中部分方法逻辑,实现自己事件处理器类
 */
class MyHandler extends DefaultHandler{
	/**
	 * @Title:startElement
	 * @Description:解析器解析xml文件中每一个标签的开始标签时(即<xx>),默认调用该方法,并把解析的内容传入方法参数
	 * @param uri 
	 * @param localName
	 * @param qName 标签名
	 * @param attributes 标签中的所有属性
	 * @throws SAXException
	 * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
	 */
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// 在此处实现自己的处理逻辑
		System.out.println(qName);
	}
	/**
	 * @Title:characters
	 * @Description:解析器解析xml文件中的标签内的文本内容时),默认调用该方法将标签中的文本内容作为参数传入
	 * @param ch
	 * @param start
	 * @param length
	 * @throws SAXException
	 * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
	 */
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// 在此处实现自己的处理逻辑
		System.out.println(new String(ch));
	}
	/**
	 * @Title:endElement
	 * @Description:解析器解析xml文件中每一个标签的结束标签时(即</xx>),默认调用该方法,并把解析的内容传入方法参数
	 * @param uri
	 * @param localName
	 * @param qName 标签名
	 * @throws SAXException
	 * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
	 */
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
 // 在此处实现自己的处理逻辑
		System.out.println(qName);
	}
}

4. 通过Dom4J包来实现对XML文件的解析

首先,必须导入dom4j的包才能使用

1.解析:

import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo1 {
	public static void main(String[] args) {
		try {
			//获取解析器对象SAXReader,SAXReader是Dom4J包中SAX方式解析XML文件的类
			SAXReader sax=new SAXReader();
			//解析指定路径下的xml文件,获取该xml文件的Document对象
			Document doc=sax.read("url");
			//获取根节点,必须先获取根节点之后才能进行后续子标签的解析处理
			//Dom4J中解析xml文件,获取标签节点时,必须一层一层的获取,也就是说,必须先获取父节点,然后才是子节点
			Element root=doc.getRootElement();
			//获取子节点,并进行解析
			List<Element> list1=root.elements();//获取root节点下所有的直接子节点,并以集合形式返回
			List<Element> list2=root.elements("name");//获取root节点下所有的直接子节点中指定名称的节点,并以集合形式返回
			Element e=root.element("name");//获取root节点下所有的直接子节点中指定名称的第一个节点
			String text=e.getText();//获取标签节点内容
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

2. 实现节点元素的增删改:

import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Demo2 {
	public static void main(String[] args) throws Exception {
		//获取解析器对象
		SAXReader reader=new SAXReader();
		//解析获取XML文件的Document对象
		Document doc=reader.read("url");
		//获取根节点
		Element root=doc.getRootElement();
		//获取要修改的节点,在这个节点下添加一个子节点
		Element e=root.element("name");
		Element child=e.addElement("childname");//在这个节点下添加一个名为childname的子节点并返回这个子节点
		//设置文本内容
		child.setText("xxx");
		//回写,使用专用的一个流XMLWriter
		OutputFormat format=OutputFormat.createPrettyPrint();//如果使用该类,则输出到文件中后,会有对齐空格符
		format.setEncoding("utf-8");//设置文件编码
		XMLWriter writer=new XMLWriter(new FileOutputStream("目标文件路径"),format);
		writer.write(doc);
		writer.close();//关闭流
	}
}


本文地址:问答解惑频道 https://www.hkm168.com/live/115914.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


问答解惑
小编:小易整编
相关文章相关阅读
  • 祝福老师句子大全,教师节送礼必备(感恩教育恩人)

    祝福老师句子大全,教师节送礼必备(感恩教育恩人)

    祝福老师句子大全,教师节送礼必备(感恩教育恩人)教师节是每年的9月10日,这一天是我们向教育恩人表达感激之情和祝福的日子。在这个特殊的日子里,送上一句祝福老师的话语,表达我们对教育工作者的敬意和感激之情,成为了每位学生们献给老师的最好礼物。...

  • 贺知章名句赏析,诗人风采展示(品味优美诗歌)

    贺知章名句赏析,诗人风采展示(品味优美诗歌)

    贺知章名句赏析,诗人风采展示(品味优美诗歌)贺知章,唐代诗人,被誉为“豪放派”代表之一。他的诗歌生动有力,意境深远,语言通俗易懂,充满浓郁的民族气息。他留下了许多优美的诗句,让人感慨万千,不得不赞叹其诗才与风采。其中,著名的“海内存知己,天...

  • 纸飞机折法,制作简单易学(挑战手工艺术)

    纸飞机折法,制作简单易学(挑战手工艺术)

    纸飞机折法,制作简单易学(挑战手工艺术)纸飞机是一款低成本、简单易学的手工艺品,因其制作过程简单易懂,大家可以尝试在家,不需要太多专业工具。首先准备一张A4大小的白纸,将其折成一半,然后再打开,将两边的边角对齐,再次往中间折叠。在折叠的位置...

  • 中超赛程表,看球购票攻略(跟随绿茵场之旅)

     中超赛程表,看球购票攻略(跟随绿茵场之旅)

    中超赛程表,看球购票攻略(跟随绿茵场之旅)中超联赛一直以来都备受球迷关注,每个赛季都会有无数的球迷前往现场观看比赛。为了让广大球迷更好地安排自己的观赛计划,我们在这里为大家介绍一下中超赛程表和看球购票的攻略。中超赛程表中超联赛一般从3月份开...

  • 春节习俗大全,传统文化策源地(领略浓郁年味)

    春节习俗大全,传统文化策源地(领略浓郁年味)

    春节习俗大全,传统文化策源地(领略浓郁年味)春节是中国最重要的传统节日,也被称作“年节”、“新春节”等,是一个具有重大历史意义和文化内涵的节日。说到春节,就不得不提到具有浓郁地域特色和文化内涵的习俗,这些习俗既体现了中华民族的优秀文化传统,...

  • “水”字旁常用字,快速记忆方法(提高汉字识别能力)

    “水”字旁常用字,快速记忆方法(提高汉字识别能力)

    “水”字旁常用字,快速记忆方法(提高汉字识别能力)汉字是中国文化的重要组成部分,对于中文学习者而言,汉字的认识和记忆是非常重要的。其中“水”字是汉字中的一个旁常用字。在学习这个字时,我们可以采用一些快速记忆方法,提高汉字识别能力。首先,我们...

  • 做梦梦见很多蛇,分析梦境内涵(看懂心理暗示)

    做梦梦见很多蛇,分析梦境内涵(看懂心理暗示)

    做梦梦见很多蛇,分析梦境内涵(看懂心理暗示)做梦时梦见很多蛇是一种比较常见的梦境,对于这种梦境的解释和分析是非常重要的。从心理学的角度来看,这种梦境不仅反映了我们潜意识中的想法和情感,也可以为我们指引未来的行动。首先,梦见很多蛇可能说明我们...

  • 制作铃声详解,打造个性化手机(表现自我风格)

    制作铃声详解,打造个性化手机(表现自我风格)

    制作铃声详解,打造个性化手机(表现自我风格)随着移动设备的普及,手机不仅是通信工具,也成为了一种个性化的表现方式。而铃声则是手机个性化中最直接的表现形式之一。制作一个个性化的铃声,不仅可以让你的手机更具有个性化的特色,同时还可以让你展现出自...

  • 周排行
  • 月排行
  • 年排行

精彩推荐