Java中的XML文件解析
来源:互联网 发布:mac搜狗五笔组词 编辑:程序博客网 时间:2024/05/23 20:36
XML
- 可扩展标记语言(Extensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
什么是可扩展标记语言?
- 可扩展标记语言是一种很像超文本标记语言的标记语言。
- 它的设计宗旨是传输数据,而不是显示数据。
- 它的标签没有被预定义。您需要自行定义标签。
- 它被设计为具有自我描述性。
- 它是W3C的推荐标准。
可扩展标记语言和超文本标记语言之间的差异
- 它不是超文本标记语言的替代。
- 它是对超文本标记语言的补充。
- 它和超文本标记语言为不同的目的而设计
Xml文档说明
xml声明 xml文档总是以一个xml声明开始,其中指明所用的xml版本、文档的编码、
文档的独立性信息。格式如下:
<?xml version=“1.0” encoding=“UTF-8”?>
DTD:文档类型定义
<!DOCTYPE greeting[ <!ELEMENT greeting(#PCDATA)>>
元素:
- xml中,元素由开始标签、元素内容和结束标签构成,对于空元素,由空元素标签构成。每个元素都有一个用名字标识的类型,同时它可以有一个属性说明集,每一个属性说明有一个名字和一个值。
元素的四种形式:
空元素:<student/>带属性的空元素:<student name=”jason" age="10"/>带内容的元素:<student > test</student>带有内容和属性的元素:<student name=”jason”> test</student>
解析xml的几种方式
1:DOM
- Document Object Module:文档对象模型
- 特点:一次加载到内存中,占用大量内存
- 常用类库:DOM, JDOM ,DOM4j
2:SAX
- Simple API for XMl基于事件的xml简单API
- 特点:事件驱动模型,按顺序读取xml,占用内存少,速度快
- 常用类库: JAXP
创建一个xml文件作为测试
<?xml version="1.0" encoding="UTF-8" ?><students> <student idcard="41272400000000"> <name>Lingdu</name> <sex>boy</sex> </student> <student idcard="44192400000000"> <name>alice</name> <sex>girl</sex> </student></students>
创建一个Student类作为测试
/** * 测试类 * @author Administrator */public class Student { String idcard; String name; String sex; public String getIdcard() { return idcard; } public void setIdcard(String idcard) { this.idcard = idcard; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Student(String idcard, String name, String sex) { super(); this.idcard = idcard; this.name = name; this.sex = sex; } public Student() { super(); }}
DOM解析XML
要使用Dom必须导入 软件包:javax.xml.parsers
DocumentBuilder类
构造方法:
protected DocumentBuilder() //受保护的构造方法
常用方法:
Document parse(File f) //将给定文件的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。abstract Document parse(InputSource is) //将给定输入源的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。Document parse(InputStream is) //将给定 InputStream 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。Document parse(InputStream is, String systemId) //将给定 InputStream 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。Document parse(String uri) //将给定 URI 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。
DocumentBuilderFactory类
构造方法:
protected DocumentBuilderFactory() //用于阻止实例化的受保护构造方法。
常用方法:
static DocumentBuilderFactory newInstance() //获取 DocumentBuilderFactory 的新实例。
软件包 org.w3c.dom
为文档对象模型 (DOM) 提供接口,该模型是 Java API for XML Processing 的组件 API。
获取元素信息的类 org.w3c.dom.Document
常用方法:
Element getDocumentElement() //这是一种便捷属性,该属性允许直接访问文档的文档元素的子节点。NodeList getElementsByTagName(String tagname) //按文档顺序返回包含在文档中且具有给定标记名称的所有 Element 的 NodeList。String getTagName() //元素的名称。String getAttribute(String name) //通过名称获得属性值。
实例
/** * 获取一个student集合 */ public static List<Student> getStudentList(){ //用来保存student集合 List<Student> studentList = new ArrayList<Student>(); try { //创建一个文档工厂解析'src/students.xml' Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("src/students.xml"); //通过标签名获取元素,返回一个NodeList集合 NodeList nodeList = doc.getElementsByTagName("student"); for (int i = 0; i < nodeList.getLength(); i++) { //第一次循环的时候,取出的第一个student,第二次取的是第二个student //获取属性idcard Node node = nodeList.item(i); //getAttribute(String name)通过名称获得属性值。 NamedNodeMap nnm = node.getAttributes(); //获取指定名称项 Node attrNode = nnm.getNamedItem("idcard"); //获取value值 String idcard = attrNode.getNodeValue(); //创建一个Student对象 Student student = new Student(); //将获取到的idcard设置进去 student.setIdcard(idcard); //获取子元素的内容 NodeList childNodeList = nodeList.item(i).getChildNodes();//这里获取到第一个student for (int j = 0; j < childNodeList.getLength(); j++) { String name = childNodeList.item(j).getNodeName(); String value = childNodeList.item(j).getTextContent(); //System.out.println("--->" + name + "----->" + value); if(childNodeList.item(j).getNodeName().equals("name")){ //value就是我们要的xml里面的姓名的内容 student.setName(value); } if(childNodeList.item(j).getNodeName().equals("sex")){ //value就是我们要的xml里面的性别的内容 student.setSex(value); } } studentList.add(student); } } catch (SAXException | IOException | ParserConfigurationException e) { e.printStackTrace(); } return studentList; }
JDOM解析XML
官网地址:
www.jdom.org
在线API文档
http://www.jdom.org/docs/apidocs/index.html
Meven地址:
<!-- https://mvnrepository.com/artifact/jdom/jdom --><dependency> <groupId>jdom</groupId> <artifactId>jdom</artifactId> <version>1.0</version></dependency>
实例
/** * 通过元素的属性获取到value * @return */ public static List<Student> getStudentList(){ List<Student> studentList = new ArrayList<Student>(); //创建一个解析器 SAXBuilder sb = new SAXBuilder(); try { //获取到xml文档 Document doc = sb.build(new FileInputStream("src/students.xml")); //获取跟元素 Element rootElement = doc.getRootElement(); //通过跟元素获取到相应的子元素,返回一个元素集合 List<?> elementList = rootElement.getChildren(); for (int i = 0; i < elementList.size(); i++) { //拿到第i个元素 Element element = (Element) elementList.get(i); //通过元素获取到名称 String studentName = element.getName(); //如果名称是student if(studentName.equals("student")){ //通过元素获取属性的值 String idcard = element.getAttributeValue("idcard"); //System.out.println(idcard); String name = element.getChildText("name"); String sex = element.getChildText("sex"); //System.out.println(idcard + "," + name + "," + sex); //创建一个Student对象,将信息添加进去 Student student = new Student(idcard,name,sex); //最后添加到集合中 studentList.add(student); } } } catch (JDOMException | IOException e) { e.printStackTrace(); } //返回一个集合 return studentList; }
DOM4J解析XML
官网地址:
http://www.dom4j.org/dom4j-1.6.1
在线API文档
http://tool.oschina.net/apidocs/apidoc?api=dom4j1.6.1%2Fapidocs
Maven地址
<!-- https://mvnrepository.com/artifact/dom4j/dom4j --> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency>
dom4J属性说明
Attribute //定义了 XML 的属性。Branch //指能够包含子节点的节点。如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为CDATA //定义了 XML CDATA 区域CharacterData //是一个标识接口,标识基于字符的节点。如CDATA,Comment, Text.Comment //定义了 XML 注释的行为Document //定义了XML 文档DocumentType //定义 XML DOCTYPE 声明Element //定义XML 元素ElementHandler //定义了Element 对象的处理器ElementPath //被 ElementHandler 使用,用于取得当前正在处理的路径层次信息Entity //定义 XML entityNode //为dom4j中所有的XML节点定义了多态行为NodeFilter //定义了在dom4j 节点中产生的一个滤镜或谓词的行为(predicate)ProcessingInstruction //定义 XML 处理指令Text //定义 XML 文本节点Visitor //用于实现 Visitor模式XPath //在分析一个字符串后会提供一个 XPath 表达式
实例
/** * 使用DOM4J解析XML文件 * @return */ public static List<Student> getStudentList(){ List<Student> studentList = new ArrayList<Student>(); //创建SAX解析事件 SAXReader sax = new SAXReader(); try { //读取XML文件返回一个文档对象 Document doc = sax.read(new FileInputStream("src/students.xml")); //通过文档对象获取到跟元素 Element rootElement = doc.getRootElement(); //System.out.println(rootElement); //通过跟元素获取到元素的迭代器 Iterator<?> it = rootElement.elementIterator(); //如果有下一条 while(it.hasNext()){ Element element = (Element) it.next(); //通过元素属性获取到内容 String idcard = element.attribute("idcard").getText(); //通过元素名称获取到文本 String name = element.elementText("name"); String sex = element.elementText("sex"); Student student = new Student(idcard,name,sex);// System.out.println(element.attribute("idcard").getText());// System.out.println(element.elementText("name"));// System.out.println(element.elementText("sex")); studentList.add(student); } } catch (FileNotFoundException | DocumentException e) { e.printStackTrace(); } return studentList; }
SAX解析XML
// 创建解析工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); // 创建解析器 SAXParser parser = factory.newSAXParser(); // 得到读取器 XMLReader reader = parser.getXMLReader(); // 设置内容处理器 BeanListHandler handler = new BeanListHandler(); reader.setContentHandler(handler); // 读取xml文档 reader.parse("src/students.xml"); ArrayList<Student> list = handler.getStudent(); Student student; for(int i = 0; i < list.size(); i++) { student = new Student(); student = (Student) list.get(i); System.out.println(student.getIdcard()+","+student.getName()+","+student.getSex()); } /** * 需要创建一个类继承DefaultHandler * @author Administrator */class BeanListHandler extends DefaultHandler{ ArrayList<Student> studentList = new ArrayList<Student>(); /** * 开始 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { } @Override public void characters(char[] ch, int start, int length) throws SAXException { } /** * 结束 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { } /** * 创建一个方法用来过去集合 * @return */ public ArrayList<Student> getStudent(){ return studentList; }}
典型使用场景
1:存放sql语句的配置文件
2:存放系统配置的配置文件
3:webservice与http接口传输数据
0 0
- Java中的XML文件解析
- Java中的Xml文件解析(DOM)
- Java中的xml文件dom方式解析
- java中的XML解析
- java中的xml解析
- Java中的解析Xml
- Java中的XML解析
- java中的XML解析
- java 解析 xml文件
- java解析xml文件
- Java解析XML文件
- java解析xml文件
- java解析xml文件
- Java解析XML文件
- java解析xml文件
- java解析xml文件
- java解析xml文件
- java解析xml文件
- 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
- Web开发中最致命的8个小错误
- Uva12325 Zombie's Treasure Chest【分类枚举】【例题7-11】
- snowflake 不重复id代码生成类
- $_SERVER各种用法
- Java中的XML文件解析
- Vim快速移动光标至行首和行尾
- Js常用逻辑函数
- LEETCODE--Reverse Vowels of a String
- 关于Spring MVC中的表单标签库的使用
- Python调用.NET库
- 字符串的层次关系
- 随便写写
- headfirst设计模式(2)—观察者模式