1、创建一个xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!--
xml:是一个可扩展的标记语言
01.很像超文本标记语言(html)
02.xml文件着重保存或者传输数据,不专注显示
03.无需预编译
04.符合w3c标准
< : &lt;
> : &gt;
" : &quot;
' : &apos;
& : &amp; <![CDATA[代码]]>
CDATA: character data 字符数据
不会被解析器解析的文本!在CDATA标签中定义的代码 不会被当作标记! PCDATA: parsed character data 被解析的字符数据
--> <students>
<student id="001" name="小黑黑" score="&gt;80">我是小黑黑</student>
<student id="002" name="大黑黑" score="&lt;80">我是大黑黑</student>
</students>
<![CDATA[ "" ;; '' <><>< ]]>

第一个xml文件

2、创建一个dtd文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE school[ //声明这是一个 school类型的文档
<!ELEMENT school(teacher)> //根节点是 school 下面只能有teacher
<!ELEMENT teacher(student+)> //teacher可以有至少一个student节点
<!ELEMENT teacher(student*)> //teacher可以有多个,也可以没有
<!ELEMENT teacher(student?)> //teacher可以有1个,也可以没有
<!ATTLIST teacher //定义teacher节点中可以有的属性
ID CDATA #REQUIRED // #REQUIRED 属性值是 必须的 #IMPLIED 属性值不是必须的 EMPTY 空的
name CDATA "false">
]>

创建一个dtd文件

3、创建一个xml文件引入dtd文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入外部的dtd文档 -->
<!DOCTYPE school SYSTEM"my.dtd">

创建一个xml引入dtd文件

=====================DOM解析xml文件=================================

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<PhoneInfo>
<Brand id="1" name="华为">
<Type name="U8650"/>
<Type name="HW123"/>
<Type name="HW321"/>
</Brand> <Brand id="2" name="苹果">
<Type name="iPhone4"/>
<Type name="iPhone8"/>
</Brand>
<Brand id="3" name="诺基亚">
<Type name="N95"/>
</Brand>
<Brand id="4" name="诺基亚">
<Type name="N95"/>
</Brand>
</PhoneInfo>
4、DOM树解析----------------------------------------------------

收藏信息.xml文件 放在项目的根目录下

public class DomTest { // 使用DOM (Document Object Model)解析xml 文件
// 因为所有的方法都需Dom树
static Document document = null; public static void main(String[] args) {
showPhone(); // 显示所有的手机信息
addPhone();
updatePhone();
deletePhone();
System.out.println("************************");
showPhone(); // 显示所有的手机信息
} /**
* 显示所有的手机信息
*/
public static void showPhone() {
DocumentBuilderFactory factory = null;
DocumentBuilder builder = null;
try {
// 01.创建解析器工厂
factory = DocumentBuilderFactory.newInstance();
// 02.创建解析器对象
builder = factory.newDocumentBuilder();
// 03.解析指定的xml文件
document = builder.parse("收藏信息.xml");
/**
* 04.获取手机的节点 NodeList接口中 只有 两个方法
* item(int index) 根据下标 获取 Node
* getLength() 获取集合大小
*/
NodeList list = document.getElementsByTagName("Brand");
System.out.println("集合的大小:" + list.getLength());
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i); // 没有获取属性的方法 Element接口实现 Node接口
Element element = (Element) node;
System.out.println(element.getAttribute("name"));
// 获取子节点
NodeList cList = element.getChildNodes();
for (int j = 0; j < cList.getLength(); j++) {
Node cNode = cList.item(j);
// 判断cNode是不是一个元素节点
if (cNode.getNodeType() == Node.ELEMENT_NODE) {
Element cElement = (Element) cNode;
System.out.println(cElement.getAttribute("name"));
}
}
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 新增手机信息
*/
public static void addPhone() {
// 在dom树上新增节点 <Brand></Brand>
Element element = document.createElement("Brand");
// 增加属性 <Brand name="诺基亚"></Brand>
element.setAttribute("name", "诺基亚");
// 再创建一个节点 相当于 诺基亚的子节点
Element elementType = document.createElement("Type");
/**
* <Brand name="诺基亚"> </Brand>
* <Type name="N95"></Type>
* 把Type节点放入Brand节点中
*/
elementType.setAttribute("name", "N95");
/**
* 给节点增加子节点
* <Brand name="诺基亚">
* <Type name="N95"/>
* </Brand>
* 还是没有放入根节点 PhoneInfo
*/
element.appendChild(elementType);
/**
* 获取根节点PhoneInfo 把 element整体放入PhoneInfo
*/
document.getElementsByTagName("PhoneInfo").item(0).appendChild(element);
// 上面的操作都在在内存中创建的对象 并没有真正的 保存到xml文件
savePhone("收藏信息.xml"); } /**
* 保存xml信息
*/
private static void savePhone(String path) {
TransformerFactory factory = null;
Transformer fomer = null;
try {
// 创建转换器工厂
factory = TransformerFactory.newInstance();
// 生成转换器
fomer = factory.newTransformer();
fomer.setOutputProperty("indent", "yes");
// 创建一个输出流 从内存中 写入 电脑的指定文件中
StreamResult result = new StreamResult(new OutputStreamWriter(
new FileOutputStream("收藏信息.xml"), "utf-8"));
// 对整个DOM树进行解析
DOMSource source = new DOMSource(document);
// 转换 保存
fomer.transform(source, result); } catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerFactoryConfigurationError e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} } /**
* 修改手机信息
* 给所有的Brand节点 增加ID属性
*/ public static void updatePhone() {
NodeList nodeList = document.getElementsByTagName("Brand");
// 循环新增节点
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
// 转换成元素 获取方法
Element element = (Element) node;
element.setAttribute("id", i + 1 + "");
}
savePhone("收藏信息.xml");
} /**
* 删除指定的手机
* 删除id为4的
*/
public static void deletePhone() {
NodeList nodeList = document.getElementsByTagName("Brand");
// 循环新增节点
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
// 转换成元素 获取方法
Element element = (Element) node;
if (element.getAttribute("id").equals("4")) { // 找到id=4
// 从父节点 删除这个节点
element.getParentNode().removeChild(element);
}
}
savePhone("收藏信息.xml");
} }

使用dom解析的代码

5、Dom4j解析-----------------------------------------------------------------------------------------

public class Dom4jTest { // Dom4j解析xml
// 因为所有的方法都需要Dom树
static Document document = null;
static Element root = null; public static void main(String[] args) {
// 获取dom树
getDocument();
// addPhone();
deletePhone();
updatePhone();
showPhone();
} // 解析xml文件
public static void getDocument() {
SAXReader reader = new SAXReader();
try {
document = reader.read("收藏信息.xml");
root = document.getRootElement();// 获取根节点
} catch (DocumentException e) {
e.printStackTrace();
}
} /**
* 显示所有的手机信息
*/
public static void showPhone() {
// 遍历所有的节点
Iterator itBrand = root.elementIterator();
while (itBrand.hasNext()) {
Element brand = (Element) itBrand.next();
System.out.println("手机的品牌是:" + brand.attributeValue("name"));
System.out.println("手机的编号是:" + brand.attributeValue("id"));
System.out.println("===========下面是子节点============");
Iterator itType = brand.elementIterator();
while (itType.hasNext()) {// 获取手机型号
Element type = (Element) itType.next();
System.out.println("手机的型号是:" + type.attributeValue("name"));
// 输出文本节点的值
if (!type.getText().equals("")) {
System.out.println(type.getTextTrim());
}
}
} } // 保存xml信息
public static void save(String path) {
OutputFormat format = null;
XMLWriter writer = null;
try {
// dom4j的转换器 不用使用 new   createPrettyPrint底层有 new
format = OutputFormat.createPrettyPrint();
// 写入xml文件
writer = new XMLWriter(new FileWriter(path), format);
writer.write(document);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关流
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} // 新增节点
public static void addPhone() {
Element element = root.addElement("Brand");
// 节点设置属性
element.addAttribute("name", "黑莓");
// 节点下面新增子节点
Element type = element.addElement("Type");
type.addAttribute("name", "A1");
// 保存 省略 我们 节点之间的拼接! dom需要拼接
save("收藏信息.xml");
} // 删除
public static void deletePhone() {
// 获取所有Brand
Iterator brand = root.elementIterator();
while (brand.hasNext()) {
Element element = (Element) brand.next(); // 拿到每一个Brand
// 获取属性值 判断是不是 要删除的对象
if (element.attributeValue("name").equals("黑莓")) {
element.getParent().remove(element);
}
}
save("收藏信息.xml");
} // 修改
public static void updatePhone() {
// 获取所有Brand
Iterator brand = root.elementIterator();
while (brand.hasNext()) {
Element element = (Element) brand.next(); // 拿到每一个Brand
// 获取属性值 判断是不是 要修改的对象
if (element.attributeValue("name").equals("哇哈哈")) {
element.attribute("name").setValue("哇哈哈哈哈");
}
}
save("收藏信息.xml");
} }

xml文件以及解析的更多相关文章

  1. JDOM方法实现对XML文件的解析

    首先要下载JDOM.jar包,下载地址:http://download.csdn.net/detail/ww6055/8880371 下载到JDOM.jar包之后导入到工程中去. 实例程序: book ...

  2. xml文件的解析

    1. xml文件的解析 void CDataMgr::readStringData() { std::string xml_name = "config/string.xml"; ...

  3. [置顶] Android开发之XML文件的解析

    Android系统开发之XML文件的解析 我们知道Http在网络传输中的数据组织方式有三种分别为:XML方式.HTML方式.JSON方式.其中XML为可扩展标记语言,如下: <?xml vers ...

  4. 类的反射及xml文件的解析

    类的反射 xml文件的解析 .properties||.xml配置文件的创建及读取内容 //创建对象 Properties properties = new Properties(); //存储 pr ...

  5. JAVA读取XML文件并解析获取元素、属性值、子元素信息

    JAVA读取XML文件并解析获取元素.属性值.子元素信息 关键字 XML读取  InputStream   DocumentBuilderFactory   Element     Node 前言 最 ...

  6. 用SAX和PULL进行XML文件的解析与生成

    XML解析有传统的dom方法还有Jsoup,SAX,PULL等,这里讲的是比较省内存的SAX和PULL方法.Android中极力推荐用PULL的方式来解析,我个人觉得pull确实比较简单,但其内部的逻 ...

  7. 【文件处理】xml 文件 DOM解析

    一.Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath 此文针对其中的DOM方法具体展开介绍及代码分析 sax.dom是两种对xml文档进行解析的方法(没有具体实 ...

  8. Java中使用DOM4J来生成xml文件和解析xml文件

    一.前言 现在有不少需求,是需要我们解析xml文件中的数据,然后导入到数据库中,当然解析xml文件也有好多种方法,小编觉得还是DOM4J用的最多最广泛也最好理解的吧.小编也是最近需求里遇到了,就来整理 ...

  9. 用java操作XML文件(DOM解析方式)

    XML 可扩展标记语言(Extensible Markup Language),是独立于软件和硬件的传输工具. XML的作用: (1)用作配置文件 (2)简化数据共享 (3)简化数据传输 XML DO ...

  10. MFC读取XML文件并解析

    现在经常会对XML文件进行操作,怎么在MFC下去读和解析XML文件呢?直接上代码: 首先得等在stdafx.h中加入这句,以引入MSXML命名空间 #import <msxml3.dll> ...

随机推荐

  1. The correct way to initialize a dynamic pointer to a multidimensional array

    From:https://stackoverflow.com/questions/18273370/the-correct-way-to-initialize-a-dynamic-pointer-to ...

  2. ui-router 1.0 001 - resolve, component, sref-active

    特性介绍: state支持component形式 state的Resolve配置可以在激活state之前先获取数据, 绑定给component ui-sref-active="active& ...

  3. Windows 7用U盘安装CentOS 7

    已经有Windows 7,准备再安装一个CentOS 7. 1. 划分磁盘空间 从磁盘上划分安装CentOS 7的安装空间.如果有多个硬盘的话,一定要在主硬盘上划分2G的空间(其实1G就够了)作为bo ...

  4. 快捷切换hosts的小工具:SwitchHosts!

    Windows 绿色版本下载:http://oldj.github.io/SwitchHosts/. 日常开发工作中,我们可能经常需要切换各种 hosts 绑定,比如在本地开发时可能需要一个开发环境的 ...

  5. Linux编译步骤概述

    Linux,一切皆文件! linux环境下,编译源码文件步骤总结 01.下载解压 一遍在开源网站有download/下载页面 02.安装基本编译环境 yum install -y gcc gcc-c+ ...

  6. python实现模拟登录

    本文主要用python实现了对网站的模拟登录.通过自己构造post数据来用Python实现登录过程.   当你要模拟登录一个网站时,首先要搞清楚网站的登录处理细节(发了什么样的数据,给谁发等...). ...

  7. 阿里云服务器Centos7.4开放80端口的记录

    问题: 阿里云服务器安装的是centos7, 搭建网站安装lnmp1.5后发现访问不了, 不明所以, 在一论坛找到关于80端口未开放的原因. 需求: 开放80端口.于是有了下面第一,二,三部分关于开放 ...

  8. xcode 报错 malloc: *** error for object 0x6c3c5a4: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug------d

    大家有时候会遇到这个错误 malloc: *** error for object 0x******: incorrect checksum for freed object - object was ...

  9. 对于移动端 App,虚拟机注册或类似作弊行为有何应对良策?

    1.APP攻击大致策略 对APP进行攻击的一般思路包括反编译APP代码.破解APP通讯协议.安装虚拟机自动化模拟: a.首先看能否反编译APP代码(例如Android APP),如果能够反编译,从代码 ...

  10. Fluent动网格【2】:Profile文件

    动网格中一个重要任务是部件运动方式的指定.在动网格中指定部件的运动,往往将部件的运动方式指定为其加速度.速度或位移与时间的相关关系,本文主要讲述如何在Fluent中利用瞬态Profile文件指定部件的 ...