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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值