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

JAVA学习笔记之(读取XML)

2016-09-11 16:17 387 查看
xml(Extensible Markup Language)可扩展标记语言的主要作用:

1)主要是实现不同功能之间的连接(比如订票与 支付)

2)不同系统之间的连接

3)数据共享

2.一种定义文档格式的语言

语法结构:

1)declaration(声明) <? ?>

<? xml version="1.0" encoding="UTF-8"?>

2)Tag(标记)<></>

<username> 内容</username>

3)Attribute(属性)

<username sex="male"></username> sex="male"即为属性

也可以把属性改为子元素

<username> 张三

<sex>male</sex>

</username>

4)注释 <!-- -->

eg:<!--这是一个注释的例子-->

获取xml文件的内容的四种解析方式:DOM SAX DOM4J JDOM

DOM解析xml:

步骤:

1.创建一个DocumentBuilderFactory的对象

DocumentBuilderFactory dbf = DocumentBuilderFactory.instance();

2.创建一个DocumentBuilder的对象

DocumentBuilder db = dbf.newDocumentBuilder();

3.通过DocumentBuilder对象的parse方法加载xml文件到当前项目

Document document = db.parse(".xml");

在不知道节点属性的个数和属性名时:

1、通过document.getElementByTagName("标签名")获得所有标签名的节点,得到一个NodeList集合

2、通过NodeList.getLength()获得集合长度,遍历集合

3、Node node = NodeList.item(index)获得里面的节点

4、通过NamedNodeMap attrs = node.getAttributes()获取所有属性集合

5、通过attrs.getLength()遍历集合,Node attr = atrrs.item(index)

6、attr.getNodeName()获得属性名,attr.getNodeValue()获取属性值

前提已经知道book节点有且只有1个id属性,将book节点进行强制类型转换,转换成element类型。

1、通过document.getElementByTagName("标签名")获得所有标签名的节点,得到一个NodeList集合

2、通过NodeList.getLength()获得集合长度,遍历集合

3、element book=(element)bookList.item(i);//强制转换为element类型

4、String attrValue = book.getAttribute("id");

Dom解析常用方法;

1.document.getElementByTagName(),获取标签集合

2.node.getAttribute(),获取属性集合(应该是一个Map集合)

3.NodeList集合(标签集合) NameNodeMap集合(属性集合)

4.所引用包为w3c的包

4.Element为标签类,我们可以将标签节点强转为Element

SAX解析xml:

通过SAX解析XML文件步骤:

1:获取一个SAXParserFactory实例

SAXParserFactory factory = SAXParserFactory.newInstance();

2:通过factory的方法获取SAXParser对象

SAXParser sp = factory.newSAXParser();

3:创建一个类继承DefaultHandler 并重写其中的一些方法进行业务处理,创建该类对象handler

用父类的startElement方法遍历开始标签,用endElement方法遍历结束标签,startDocument方法标志解析开始,endDocument方法标志解析结束

4:用SAXParser对象的parse方法接收XML文件选择传入String uri 和 Handler对象的parse方法

praser.parse("books.xml",handler);

解析xml元素:

1. 重写DefalutHandler的实现类对象的startElement()方法

2. 在startElement()方法中,先调用DefaultHanlder 的startElement()方法

3. 已知节点的属性名的情况下

if(qname.equals("book")){

String value = attributes.getValue("id");

}

4.不知节点的属性名的情况下

获取属性长度

int length=attributes.getLength();

获取属性名和属性值

for(int i=0;i<length;i++){

System.out.print(attributes.getQname(index)+attributes.getValue(index));

}

SAXParserHandler类的执行顺序为:startDocument()开始Xml解析--->第一行,以后每行的执行顺序为——>startElement()---characters()--->endElemnet()---->到最后一行的<bookstore>---->endDcunment()。

使用 SAX 解析 XML 文件的节点名和节点间文本

startElement方法——String qName(第三个参数):节点名

startElement方法——Attributes attributes(第四个参数):节点名的属性操作

characters方法——char[] ch(第一个参数):xml整个文本内容,所以需截取想要的内容

以下代码

public void endElement(String uri, String localName, String qName)

throws SAXException {

//调用DefaultHandler类的endElement方法

super.endElement(uri, localName, qName);

//判断是否针对一本书已经遍历结束

if (qName.equals("book")) {

System.out.println("======================结束遍历某一本书的内容");}

}

public void characters(char[] ch, int start, int length)

throws SAXException {

super.characters(ch, start, length);

value = new String(ch, start, length);

if (!value.trim().equals("")) {

System.out.println("节点值是:" + value);}

}

xml的SAX解析并将解析的内容及xml结构形式保存至Java对象中。

SAX解析:

1、获取一个SAXParserFactory的实例:SAXParserFactory factory = SAXParserFactory.newInstance();

2、通过factory获取SAXParser实例:SAXParser parser = factory.newSAXParser();

3、创建SAXParserHandler对象:SAXParserHandler handler = new SAXParserHandler();

4、将xml文件和解析方式handler加载到SAXParser实例:parser.parse("books.xml",handler);

解析的时候,是startElement-characters-endElement , characters解析完一个属性,就到endElement,然后又解析一个属性又到endElement,最后解析完全部属性,到endElement又到startElement开始下一个节点。

ArrayList保存对象 ArrayList<Book> BookList=new ArrayList<Book>();

BookList.add(book);book=null;后继续遍历

public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException// qName是String类型节点名称;attributes是Attributes类型的实例,属性的意思;

JDOM解析xml:

JDOM是第三方提供的解析XML方法,需要jdom-2.0.5.jar包

步骤:

1、创建SAXBuilder对象

SAXBuilder saxBuilder = new SAXBuilder();

2、创建一个输入流将XML加载到输入流中

InputStream in = new FileInputStream("books.xml");

3、通过saxBuilder的build()将输入流加载到saxBuilder中

Document document = saxBuilder.build(in);

4、根据document的getRootElement()获取xml中的根节点

Element rootElement = document.getRootElement();

5、获取根节点下的子节点的List集合

List<Element> bookList = rootElement.getChildren();

获取某个元素的属性

元素.getAttributes();

获取2元素属性的name、值

元素.getName();节点无论什么类型,都是得到节点的名称

元素.getVlaue();得到节点的文本,不会保留空格和回车

注意:JDOM中的getName()和getValue()与SAX、DOM是不一样的

使用JDOM解析子节点的节点名和节点值:

1,使用节点的getChildren方法获取子节点的List集合

2,使用Foreach循环遍历

3,通过getName方法获取节点名,getValue方法获取节点值

我们的项目中直接配置build path指定的jar包如果是在我们PC的硬盘某个路径,那么在日后导出项目时候,项目中是没有jar包的。

k可以通过操作:项目根目录下新建lib文件夹——复制—粘帖包——右击包选择“构建路径”——“添加至构建路径”即可。

使用DOM4J解析XML文件:

1,引用DOM4J的JAR包

2,创建一个SAXReader对象

3,使用SAXReader对象的read方法传入一个File对象,该方法返回一个Document对象

4,使用Document对象的getRootElement方法获取根节点

5,通过根节点对象的elementIterat
4000
or方法获取book迭代器

6,遍历迭代器获取子节点,通过迭代得到的element对象的getName方法和getStringValue方法分别获取属性名和属性值

基础方法:DOM(平台无关的官方解析方式)、SAX(基于事件驱动的解析方式)

扩展方法:JDOM、DOM4J(在基础的方法上扩展出的,只有在java中能够使用的解析方法)

DOM:一次性将整个xml文件加载到内存中,形成DOM树

优点:形成了树结构,直观好理解,代码更容易编写

解析过程中树结构保留在内存中,方便修改

缺点:当xml文件较大时,对内存消耗比较大,容易影响解析性能并造成内存溢出

SAX:逐条语句判断解析

优点:采用事件驱动模式,对内存消耗比较小

适用于只需要处理xml中数据时

缺点:不易编码

很难同时访问同一个xml中的多处不同数据

JDOM:仅使用具体类而不使用接口

API大量使用了Collections类

DOM4J:JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能

DOM4J使用接口和抽象基本类方法,是一个优秀的Java XML API

具有性能优异、灵活性好、功能强大和极件。

使用的特点

是一个开放源代码的软件。JUnit是Java提供的一种进行单元测试的自动化工具。测试方法可以写在任意类中的任意位置。使用JUnit可以没有main()入口进行测试。

DOM4J在灵活性和对复杂xml的支持上都要强于DOM

DOM4J的应用范围非常的广,例如在三大框架的Hibernate中是使用DOM4J的方式解析文件的。

DOM是w3c组织提供的一个官方解析方式,在一定程度上是有所应用的。

当XML文件比较大的时候,会发现DOM4J比较好用

1.JUnit:Java提供的单元测试;@Test注解;采用JUnit不需要程序入口main方法

2.性能测试结果:几kB的xml文件;建议使用DOM4J解析

DOM-33ms

SAX-6ms

JDOM-69ms

DOM4J-45ms

工程右键build path --Add library--JUnit单元测试 --version:JUnit4

DOM 有可能溢出

多使用DOM4J
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: