JAVA学习笔记之(读取XML)

来源:互联网 发布:句读知不知是什么意思 编辑:程序博客网 时间:2024/05/01 15:04
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,通过根节点对象的elementIterator方法获取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



0 0