您的位置:首页 > 编程语言 > Java开发

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: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 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接口传输数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java xml 解析