XML 一/二、XML 的初次邂逅 及 应用 DOM 方式解析 XML

1-1 初次邂逅XML

表现:以.xml为文件扩展名的文件

存储:树形结构

每个节点需要一个开始标签<标签名>和结束标签</标签名>。

节点名称区分大小写。

节点的属性

  1. 可以写在节点名称标签开始的后半部分<标签名 属性="属性值">。
  2. 可以作为节点的值写在两个标签中间。<标签名>节点值</标签名>。(节点值不用双引号)

可以不断拓展子节点来描述父节点包含的内容。

xml在写正文前,要加一个声明:<?xml version="1.0" encoding="UTF-8"?>声明版本与编码。

xml用于存储集成信息,能用相同的xml文件将不同的东西联系起来。

2-1  如何进行 XML 文件解析前的准备工作

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

DOM、SAX :java 官方方式,不需要下载jar包

DOM4J、JDOM :第三方,需要网上下载jar包

准备工作

1、创建一个DocumentBuilderFactory的对象

DocumentBuilderFactory dbf = DocumnetBuilderFactory.instance();

2、创建一个DocumentBuilder的对象

DocumentBuilder db = dbf.newDocumentBuilder();

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

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

2-2  使用 DOM 解析 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");

2-3  使用 DOM 解析XML 文件的节点名和节点值

1.先获取子节点,Node下有方法getChildNodes()来获取某个节点的子节点的集合,返回NodeList类型.

NodeList childNodes = book.getChildNodes();  // 包含book节点所有的子节点,两个标签之间的所有内容都看成是子节点.

2.通过childNodes的getLength()方法返回字点的个数(空格与换行字符看成为一个文本节点,标签与结束标签看成一个元素节点)

3.通过NodeList的item(i)获取指定位置子节点的名称返回Node类型.再用Node类型的getNodeName()方法就可以获取节点名

Node childnode=childNodes.item(i);

String name=childnode.getNodeName();

可以通过Node类的getNodeType()来区分文本类型的node以及元素类型的node,看当前Node类型是否与Node."节点类型英文全称"相同.

if(childnode.getNodeType==Node.ELEMENT_NODE)

{System.out.println(name)}

4.不能直接通过Node的getNodeValue()来获取节点的值,因为元素节点的nodeValue的返回值为null而且标签之间的文本被看做是该标签的子节点.所以要用Node的getFirstChild()此时获取的子节点为文本节点,Text节点类型的nodeValue返回值为节点内容,再getNodeValue()。

或者直接用Node的getTextContent()方法直接获取节点值。

如果该Node节点还存在其他子节点并且有节点值<name><a>广州大学</a>华软学院</name>,那么用getFirstChild().getNodeValue()一样是null,因为获取的子节点仍然是element类型的

如果用Node的getTextContent(),一样会把<a>元素节点当成是Content输出。 结果为广州大学华软学院.

猜你喜欢

转载自blog.csdn.net/qq_40638497/article/details/81475768