首页 > 编程 > Java > 正文

Java中的XML文件解析

2019-11-08 02:03:52
字体:
来源:转载
供稿:网友

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

1


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。

2

3


获取元素信息的类 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; }

4


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; }

5


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; }

6


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接口传输数据


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表