关闭

XML基础知识及四种解析方法

标签: xmlDom4JDOMDOM的结构组成
225人阅读 评论(0) 收藏 举报
分类:

PS:第一次用markdown编辑器来编辑,发现它真是其乐无穷啊。嘿嘿,谁用谁知道@-@

1. XML是什么

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 被设计用来结构化、存储以及传输信息。
  • XML 的设计宗旨是传输数据,而非显示数据,HTML被设计来显示数据,二者不可相互替代
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 没什么特别的。它仅仅是纯文本而已。有能力处理纯文本的软件都可以处理 XML。

这里先给出一个XML文件,下面的讲解以此为例来说明

<?xml version="1.0" encoding="UTF-8"?>
<product wangke="king">  
   <car>
       <name>Lamborghini</name>
       <number>鄂A:88888</number>
       <firm name="Automobili">
           <address>意大利圣亚加塔·波隆尼</address>
           <value>10billion</value>
       </firm>
       <birthday>2017</birthday>
       <lifeSpan>20</lifeSpan>
   </car>  
   <car>
       <name>Ferrari</name>
       <number>鄂A:99999</number>
       <firm name="恩佐·法拉利">
           <address>意大利马拉内罗</address>
           <value>30billion</value>
       </firm>
       <birthday>2018</birthday>
       <lifeSpan>30</lifeSpan>
   </car>  
</product>

2.Java中的XML描述对象

1.Node

Node接口是最基本的一个接口,相当于Java中的Object对象,其他所有的XML组成元素都继承自这个接口。这个接口主要用来描述XML其他所有组成元素的公共属性和公共操作。
Node中有很多static short类型的字段,这些字段表示某一个节点具体是什么类型的Node。比如,若该节点是一个Element,则类型为ELEMENT_NODE;若该节点是一个Text,则类型为TEXT_NODE。

2.Element

Element接口用来描述XML中的一个元素,可以理解为HTML中的一个标签,如示例中的

<name>Ferrari</name>

3.Text

Text接口继承自CharacterData,并且表示Element或Attr的文本内容(在XML中称为字符数据),如果元素的内容中没有标记,则文本是一个Text类型的对象中。否则将继续对文本进行解析。

4.Attr

Attr表示Element对象中的属性,由于它不是它们描述元素的子节点,DOM不会将它们作为文档树的一部分,所以Node属性的parentNode,previousSibling和nextSibling作用于Attr对象时返回null。
如下,这个节点中的name=”Automobili”就是一个Attr类型的Node。

<firm name="Automobili">

5.Document

表示整个XML文档,它是文档树的根,并提供对文档数据的基本访问。

6.Root节点

其实Java中没有描述根节点,因为根节点也是一个Element,每个XML文档中有且仅有一个根节点,就是包裹在最外层的Element。很多解析XML的框架都有document.getRootElement()方法,返回的就是一个根节点。Java API自带的org.w3c.dom 中document.getFirstChild(),也是返回根节点。

特别注意:每个Element的前后都有一个Text类型的Node,不要以为上下两个Element之间有换行,没有任何文本,就以为它们之间没有Node,以下图为例:
XML

进一步挖掘这句话可以得出一个结论:任何一个Element,调用其getFirstChild()都将返回一个Text类型的Node。(尽管它可能在视觉上表现为一个换行)

Node root=document.getFirstChild();
NodeList nodes=root.getChildNodes();
System.out.println(nodes.getLength());  //输出子节点个数为5,而不是2
root.getFirstChild.getNextSibling(); //这样才返回第一个car元素

还需要特别注意Node中的如下三个属性和对应的get方法,nodeName,nodeValue,attributes
W3C上是这样说明的:
属性nodeName,nodeValue,attributes作为一个获取节点信息的机制,无需向下强制转换为特定的派生接口,在没有对特定的nodeType(如Element的nodeValue或Comment的attributes)的属性进行显式映射的情况下,这将返回null。注意,特定的接口可能包含其他更方便的机制来获取和设置相关信息。

上面的话可以这样简单来理解:某一种类型的node若没有特殊实现其getNodeValue()(或者getAttributes()等方法),默认返回null。但需要注意的是,一个node一定有类型和名称,所以getNodeType()和getNodeName()是一定有返回值的。

举个栗子:如果一个Node是Text类型,则getNodeValue()返回其文本内容,否则返回null,因为只有Text类型的Node实现了getNodeValue()方法(也就是说,getNodeValue()方法只能获取到Text类型的Node中的数据)

下面是本人写的一个简单的递归遍历所有的Text类型的Node(原谅我的懒,最近实在项目缠身。日后一定抽空完善),在此基础上加工一下就可以实现从XML中解析出一个Java实体类。

public static void ergodic(Node node,Map<String, String> map){
        if(node.getNodeType()==Node.TEXT_NODE){
            System.out.println(node.getParentNode().getNodeName()+":"+((Text)node).getWholeText());
            return;
        }
        NodeList list=node.getChildNodes();
        for(int i=0;i<list.getLength();++i){
            ergodic(list.item(i), map);
        }
}

四种(框架)解析方法正在更新中……

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Servlet基础知识详解

Servlet基础知识详解Servlet基础知识详解 Servlet程序执行全过程 Servlet映射路径 Servlet映射练习 Servlet生命周期 为什么要学习Servlet生命周期 Serv...
  • jpzhu16
  • jpzhu16
  • 2016-06-10 10:40
  • 4822

JAVA解析XML有哪几种方法?并简述各自的优缺点

DOM:   是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。是基于信息层次的 优点有:由于树在内存中是持久的,因此可...
  • maydaysar
  • maydaysar
  • 2017-03-27 10:28
  • 1363

详解Java解析XML的四种方法

XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML。本文将详细介绍用Java解析XML的四种方法。         XML现在已经成为一种通用的数据交换格式,它的平台无...
  • hmiter
  • hmiter
  • 2017-02-14 21:02
  • 8853

AOP基础知识及AOP切面编程之注释方法、xml配置方法

AOP概念 Aspect(切面):它跟类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是对横切性关注点的抽象 joinpoint(连接点):所谓连接点就是被拦截到的点,在spring中,...
  • wanghaiping1993
  • wanghaiping1993
  • 2014-08-17 10:15
  • 602

Android入门学习笔记(一)|基础知识|文件数据存储读取|解析XML

屏幕分辨率 HVGA:320×480 QVGA:240x320 WQVGA400:240X400 WQVAG432:240X432 WVGA800: 480X800 ...
  • Only_Tan
  • Only_Tan
  • 2014-03-05 11:37
  • 1350

android基础知识13:AndroidManifest.xml文件解析

AndroidManifest.xml文件解析。 1、重要性         AndroidManifest.xml是Android应用程序中最重要的文件之一。它是Android程序的全局...
  • virus026
  • virus026
  • 2014-06-10 23:40
  • 755

【Android基础知识】网络获取Xml文件并解析

从服务器获取xml内容并解析 girls.xml tian 12 tianting di 12 庞各庄 xml解析类 Xmlparse.java pu...
  • u010583599
  • u010583599
  • 2016-07-20 14:13
  • 741

Verilog基础知识1(FPGA 设计的四种常用思想与技巧之一 -- 乒乓操作)

FPGA 设计的四种常用思想与技巧之一   王诚 Lattice Semiconductor       本文讨论的四种常用 FPGA/CPLD 设计思想与技巧: 乒乓操作、 串并转换、 流水线操作、...
  • Times_poem
  • Times_poem
  • 2016-05-13 20:58
  • 5953

【Android基础知识】Activity的四种启动模式

Android的Activity有四种启动模式,在实际的应用中,我们应该根据特定的需求为每个活动指定特定的启动模式,这四种启动模式分别是 standard、singleTop、singleTask、...
  • u010583599
  • u010583599
  • 2016-08-01 17:51
  • 280

[C# 基础知识系列] 专题十五:全面解析扩展方法

引言:    C# 3中所有特性的提出都是更好地为Linq服务的, 充分理解这些基础特性后。对于更深层次地去理解Linq的架构方面会更加简单,从而就可以自己去实现一个简单的ORM框架的,对于Linq...
  • lizhi3186575
  • lizhi3186575
  • 2013-12-20 23:35
  • 1113
    个人资料
    • 访问:6432次
    • 积分:185
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条