Java中的XML文件解析
2017-02-20 10:55
344 查看
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:DOMDocument 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 entity Node //为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接口传输数据
相关文章推荐
- 用XMLEncoder和XMLDecoder创建并解析XML文件Java实例
- java解析xml文件的2种方法:sax,dom
- Java解析XML文件(二)
- java对XML文件的解析、节点的增加、删除操作总结
- java解析xml文件四种方式
- java对xml全面解析,增,删,改,以及将java对象重新编组为xml文件
- Java解析XML文件的四种方法
- java 解析xml文件样例
- java解析xml文件四种方式
- java解析xml文件四种方式
- 使用Java解析XML文件(一)——JDOM篇
- JAVA解析XML文件的四种方法
- 创建并解析XML文件Java实例
- Java解析XML文件(一)
- java解析xml文件四种方式
- java - xml文件解析后不能删除
- java解析xml文件四种方式
- java解析xml文件四种方式
- java解析xml文件
- java解析xml文件四种方式