个人备案能做公司网站吗,贵州省健康码二维码图片下载,将wordpress安装到哪个数据库,软件服务开发二、XML
2.1 XML 简介 XML 即可扩展标记语言#xff0c;一种简单的数据存储语言#xff0c;使用一系列简单的标记来描述结构化数据 XML 的特点 XML 与操作系统#xff0c;编程语言的开发平台无关规范统一#xff0c;实现不同系统之间的数据交互 2.1.1 XML 的文档结构
以下…二、XML
2.1 XML 简介 XML 即可扩展标记语言一种简单的数据存储语言使用一系列简单的标记来描述结构化数据 XML 的特点 XML 与操作系统编程语言的开发平台无关规范统一实现不同系统之间的数据交互 2.1.1 XML 的文档结构
以下是 XML 代码描述图书的信息
?xml version1.0 encodingUTF-8?
booksbook idbk101title.NET高级编程/titleauthor王珊/authordescription包含C#框架和网络编程等/description/bookbook idbk102titleXML基础编程/titleauthor李明明/authordescription包含XML基础概念和基本用法/description/book
/books通过以上代码来具体了解 XML 文档结构
2.1.2 XML 声明
?xml version1.0 encodingUTF-8? 表示 XML 声明用于标明这是一个 XML 文件XML 声明主要有以下部分组成 version 文档符合 XML 1.0 规范encoding 文档字符编码默认为 UTF-8 对于任何一个 XML 文档都是固定格式
2.1.3 标签
XML 中通过用尖括号 括起来的各种标签来标记数据标签必须成对使用必须有开始标签 和 结束标签 /标签之间是标签描述的内容例如 author王珊/author 则表示作者信息
2.1.4 元素 XML 文档的主要部分是元素 元素由开始标签、结束标签和元素内容注册 元素内容指开始标签和结束标签之间的内容可以包含子元素字符数据等 元素的命名规则如下 名称中可以包含字母、数字或其他的字符名称不能以数字或标点符号开始名称不能以字符 xml、XML 等开始名称中不能包含空格元素允许是空元素如 title/title、title/ 根元素 每个 XML 文档必须有且仅有一个根元素如 books/books根元素是一个完全包括文档中其他所有元素的元素根元素的起始标签要放在所有其他元素的起始标签之前根元素的结束标签要放在所有其他元素的结束标签之后 属性 book idbk101 标签中使用 id 属性描述图书的编号信息属性的定义语法如下 元素名 属性名属性值属性值用双引号包裹一个元素可以有多个属性多个属性之间用空格隔开元素中不能直接包含 、、属性只能加在元素的起始标签上 XML 中的特殊字符的处理 在 XML 中有时在元素的文本中会涉及一些特殊字符 使用这些字符需要用到 XML 中的预定义实体代替XML 中的预定义实体和特殊字符的对应关系 特殊字符实体名称amp;quot;’apos; CDATA - 未解析字符数据 术语 CDATA 是不应该由 XML 解析器解析的文本数据。 像 和 字符在 XML 元素中都是非法的。 会产生错误因为解析器会把该字符解释为新元素的开始。 会产生错误因为解析器会把该字符解释为字符实体的开始。 CDATA 部分中的所有内容都会被解析器忽略 CDATA 语法格式如下 ![CDATA[要显示的字符]]2.2 解析 XML 概述 在实际应用当中经常需要对 XML 文档进行各种操作 如在应用程序启动时去读取 XML 配置文件信息 或把数据库中的内容读取出来转为 XML 文档形式 这种情况就要运用到 XML 文档的解析技术 目前常用的 XML 解析技术有 4 种 2.2.1 DOM
DOM 是基于 XML 的树结构来完成解析的DOM 解析 XML 文档时会根据读取的文档构建一个驻留内存的树结构使用 DOM API 可以操作这个树结构支持删除、修改、重新排列等多种功能但 DOM 解析同时也比较消耗资源
2.2.2 SAZ
SAZ 是基于事件的解析为了解决 DMO 解析的资源消耗而出现的SAZ 是通过事件处理器完成对文档的解析SAZ 不用事先调入整个文档所以它的优势就是占用资源少内存消耗小在解析数据量较大的 XML 文档时会采用这种方式
2.2.3 JDOM
JDOM 是针对 Java 的特定文档模型它简化了与 XML 的交互并且币使用 DOM 更快JDOM 仅使用具体类而不使用接口在某方面简化了 API但是也限制了灵活性API 大量使用了 Java 集合类型对于属性这类的 Java 开发者而简化了使用
2.2.4 DOM4J
DOM4J 是一个非常优秀的 Java XML API具有性能优异、功能强大、易用的特点DOM4J 用于在 Java 平台上使用 Java 集合框架处理 XML、XPath 和 XSLTDOM4J 大量使用接口面向接口编程使它币 JDOM 更加灵活
2.3 使用 DOM 读取 XML 数据
2.3.1 DOM 概念
DOM 即文档对象模型DOM 把 XML 文件映射成一课倒挂的 “树”以根元素为根节点每个节点都以对象形式存在通过存取这些对象就能存取 XML 文档的内容例如创建文件 book.xml 并保存book.xml 内容如下
?xml version1.0 encodingUTF-8?
book idbk101title三国演义/titleauthor罗贯中/authorprice30元/price
/bookbook.xml 对应的 DOM 树结构 2.3.2 使用 DOM 读取手机收藏信息
可以使用 JAXP 来解析 XMLJAXP 包含 3 个包这 3 个包都在 JDK 中 org.w3c.domW3C 推荐的用于使用 DOM 解析 XML 文档的接口org.xml.sax用于使用 SAZ 解析 XML 文档的接口javax.xml.parsers解析其工厂工具获得并配置特殊的解析器 使用 DOM 解析 XML 时需要导入这些包中相关的类JAXP 会把 XML 文档转换成一个 DOM 树使用 DOM 解析 XML 文档的步骤如下 创建解析器工厂对象即 DocumentBuilderFactory 对象由解析器工厂对象创建解析器对象即 DocumentBuilder 对象由解析器对象对指定的 XML 文件进行解析构建相应的 DOM 数创建 Document 对象以 Document 对象为起点对DOM 树的节点进行增加、删除、修改、查询等操作
2.3.3 使用 DOM 读取 XML 数据使用 DOM 读取手机收藏信息中的品牌和型号信息 示例
XML 文档代码如下
?xml version1.0 encodingUTF-8?
PhoneInfoBrand name华为Type nameP90//BrandBrandType nameiPhone Z/Type nameiPhone ZL//Brand
/PhoneInfo手机收藏信息的 XML 文档对应的 DOM 树主要结构 根据使用 DOM 解析 XML 的文档步骤关键代码如下
package Test01;import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;public class Test01 {public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {//得到 DOM 解析器的工厂实例DocumentBuilderFactory dbfDocumentBuilderFactory.newDefaultInstance();//从 DOM 工厂获取 DOM 解析器DocumentBuilder dbdbf.newDocumentBuilder();//解析 XML 文档等到一个 Document 对象即DOM数//xml 文件位置从 src包下开始Document doc db.parse(src/main/java/Test01/收藏信息.xml);//等到所有的 Brand 节点列表信息NodeList brandListdoc.getElementsByTagName(Brand);//循环 Brand 信息for (int i0; ibrandList.getLength();i){//获取第 i 个 Brand 元素信息Node brandbrandList.item(i);//获取第 i 个 Brand 元素的 name属性Element element (Element) brand;String attrValueelement.getAttribute(name);//获取第 i 个 Brand 元素的所有子元素的 name 属性值NodeList typeselement.getChildNodes();for (int j 0; j types.getLength() ; j) {Node nodetypes.item(j);if (node.getNodeType()Node.ELEMENT_NODE){Element typeElement ((Element) types.item(j));String typetypeElement.getAttribute(name);System.out.println(手机attrValuetype);}}}}
}
2.3.4 使用 DOM 解析 XML 时主要使用以下对象
Node 对象
Node 对象是 DOM 结构中的基本对象代表了文档树中的一个抽象节点Node 对象的主要方法如下
方法名说明getChildNodes()返回包含此节点所有子节点 NodeListgetFirstChild()如果节点存在子节点则返回第一个子节点getLastChild()如果节点存在子节点则返回最后一个子节点getNextSibling()返回在 DOM 树中这个节点的下一个兄弟节点getPreviousSibling()返回在 DOM 树中这个节点的上一个兄弟节点getNodeName()返回节点的名称getNodeValue()返回节点的值getNodeType()返回节点的类型
NodeList 对象
NodeList 对象是指包含了一个或多个节点 (Node) 列表可以通过方法来获取列表中的元素NodeList 对象的常用方法
方法名说明getLength()返回列表长度item(int idnex)返回指定位置的 Node 对象
Document 对象
Document 对象代表整个 XML 文档所有其他的 Node 都以一定的顺序包含在 Document 对象之内它是对 XML 文档进行操作的起点先通过解析 XML 源文件获取 Document 对象然后来执行后续的操作Document 对象的主要方法
方法名说明getElementsByTagName(String name)返回一个 NodeList 对象包含所有给定标签名的标签getDocumentElement()返回一个代表这个 DOM 树的根节点的 Element 对象
Element 对象
Element 对象代表 XML了文档中的 标签元素在标签中可以包含属性因而 Element 对象中也有存取属性的方法Element 对象方法如下
方法名说明getAttribute(String attributename)返回标签中给定属性名称的属性的值getElementsByTagName(String name)返回具有给定标签名称的所有后代 Elements 的 NodeList
注意事项
XML 文档中的空白符也会被作为对象映射在 DOM 树中所以直接调用 Node 对象的 getChildNodes() 方法有时会出现一些问题解决方案如下 使用 Element 的 getElementByTagName(String name)返回的 NodeList 对象就是所期待的对象调用 Node 的 getChildNodes() 方法得到 NodeList 对象每次通过 item() 方法提取 Node 对象然后判断判断 node.getNodeType()Node.ELEMENT_NODE 即判断是否为元素节点
2.4 使用 DOM4J 解析 XML
2.4.1 DOM4J API 概述
使用 DOM4J 只要了解 XML-DOM 模型就能使用DOM4J 主要接口都在 org.dom4j 这个包里定义
类说明Attribute定义了 XML 属性Branch为能够包含子节点的节点定义了一个公共行为CDATA定义了 XML CDATA 区域CharacterData是一个标识接口标识基于字符的节点如 CDATA、Comment 和 TextComment定义了 XML 注释的行为Document定义了 XML 文档DocumentType定义 XML DOCTYPE 声明Element定义了 XML 元素ElementHandler定义了 Element 对象的处理器ElementPath被 ElementHandler 使用用于取得当前正在处理的路径层次信息Entity定义 XML 实体Node为 dom4j 中所有的 XML 节点定义了多态行为NodeFilter定义了在 dom4j 节点中产生的一个滤镜或谓词的行为ProcessingInstruction定义 XML 处理指令Text定义了 XML 文本节点Visitor用于实现 Visitor 模式XPath通过分析一个字符串提供一个 XPath 表达式
使用这些需要提前导入一个 dom4j 的包
!-- https://mvnrepository.com/artifact/org.dom4j/dom4j --
dependencygroupIdorg.dom4j/groupIdartifactIddom4j/artifactIdversion2.1.4/version
/dependency
2.4.2 使用 DOM4J 操作 XML 数据
1、Document 对象相关
读取 XML 文件获得 Document 对象
SAXReader readernew SAXReader();
Document documentreader.read(new File(input.xml));2、节点相关
获得文档的根元素
Element rootElmdocument.getRootElement();取得某节点的单个子节点
Element memberElmrootElm.element(member); //member 是节点名取得节点的文字
String textemeberElm.getText();
//或者用下面这种方式
//取得根元素下的 name 子节点的文字
String textrootElm.elementText(name);在某个节点下添加子节点newMemberElm 是某个已存在的节点
Element ageElmnewMemberElm.addELment(age);设置文字节点
ageElm.setText(29);删除某节点
parentElm.remove(childElm);// childElm 是待删除的节点parentElm是其父节点3、属性相关
取得某节点下的某属性
Element rootdocument.getRootElement();
Attribute attributetoor.attribute(size); //属性名 size取得属性的值
String textattribute.getText();
//也可以使用
String text2root.element(name).attributeValue(firstname);为某节点添加属性
newMemberElm.addAttribute(name,learningdom4j);设置属性的值
Attribute attributeroot.attribute(name);
attribute.setText(learningdom4j);删除某属性
Attribute attributeroot.attribute(size); //属性名saize
root.remove(attribute)e attributetoor.attribute(“size”); //属性名 size - 取得属性的值~~~java
String textattribute.getText();
//也可以使用
String text2root.element(name).attributeValue(firstname);为某节点添加属性
newMemberElm.addAttribute(name,learningdom4j);设置属性的值
Attribute attributeroot.attribute(name);
attribute.setText(learningdom4j);删除某属性
Attribute attributeroot.attribute(size); //属性名saize
root.remove(attribute)