Java操作xml

XML

XML:扩展标记语言,用来结构化、存储、传输数据
1. 区分大小写
2. 属性值必须封装在引号中
3. 属性必须有值
4. 必须有结束标记

XML的文档结构
1. 头标,XML声明:<?xml version="1.0" encoding="UTF-8"?>
		-> 使文件符合xml标准规格,必须有
2. 文档类型的声明:<! DOCTYPE ....>
 		-> 确保文档的正确性,非必须有
4. 正文:<根元素><根元素/>
<? ?>:处理指令,用来给处理XML文件的应用程序提供信息

<!-- -->:注释

实体引用

使用实体引用代替特殊字符,如: &lt 代替 <
或使用CDATA来显示特殊字符,CDATA中的文本不会被xml处理器解析:

<![CDATA[内容]]>
文档类型的定义 DTD

DTD包含了一些规则,通过设定文档的合法子元素和每个元素的属性,来说明文档应该如何构成。
这些规则包含在文档类型的声明的DOCTYPE声明中:

<! DOCTYPE 根元素 [DTD规则] > : DTD存放在xml文档中
<! DOCTYPE 根元素 SYSTEM “DTD文件/URL” > : DTD存放在外面,通过system声明来引入

命名空间

避免元素名冲突
使用URI来标识命名空间
在标签中使用xmlns属性定义命名空间和别名:

xmlns:别名=“命名空间URI”

理解:通过xmlns引入命名空间,并为其设置别名,通过别名:元素来使用命名空间中的元素。

示例1:

<h:table xmlns:h="http://www.w3.org/TR/html4/">
	<h:tr>
		<h:td>Apples</h:td>
		<h:td>Bananas</h:td>
	</h:tr>
</h:table>

h是别名,h:table是指使用的是命名空间“http://www.w3.org/TR/html4/”中的table元素。

示例2:

<configuration xmlns="http://www.test.com/1.html"
	xmlns:si="http://www.test.com/2.html">
	<size value="20" si:unit="mm"/>
</configuration>

这里有两个命名空间,子元素可以继承父元素的命名空间,所以子元素size和父元素configuration都是URI http://www.test.com/1.html的命名空间的组成部分。
没有使用别名前缀的属性不能成为命名空间的组成部分,所以属性si:unit是URI http://www.test.com/2.html的命名空间的组成部分,而属性value则不是任何的命名空间的组成部分。

DOM分析器处理命名空间:
getNodeName()/getTagName() → 返回带有别名前缀的权限定名【h:table】
getLocalName() → 返回本地名(不带有别名前缀)【table】
getNameSpaceURI() → 返回命名空间URI【http://www.test.com/1.html】

Java操作XML:读取、新增、修改XML中的数据

XML 解析详解 - 四种解析方式
XML 的解析方式分为四种:DOM 解析、SAX 解析、JDOM 解析、DOM4J 解析。

DOM分析器

文档对象模型分析器,将XML文档读入一个树状结构中。
Java 解析 XML 的四种方式

  1. 生成DocumentBuilderFactory对象:DocumentBuilderFactory.newInstance()
  2. 生成DocumentBuilder对象:factory.newDocumentBuilder()
  3. 生成Document对象:builder.parse(File)
    → 加载xml文件
  4. 获取根节点:doc.getDocumentElement()
  5. 获取某节点的所有子节点:node.getChildNodes() → NodeList
  6. 遍历节点集合,获取集合中的节点:nodeList.item(index) → Node
  7. 获取某节点的上一个或下一个兄弟节点:node.getPreviousSibling()/getNextSibling()
  8. 获取节点的属性和值:node.getNodeName()/getNodeValue()
  9. 获取节点的文本数据:node.getData()

Document对象代表了XML文档在内存中的树状结构。

SAX分析器

基于XML的简单API分析器:读取XML文档时,负责生成相应的事件。

  1. 生成SAXParserFactory对象:SAXParserFactory.newInstance()
  2. 生成SAXParser对象:factory.newSAXParser()
  3. 处理xml文档:parser.parse(source,handler)
JDOM 解析
  1. 生成SAXBuilder对象:new SAXBuilder()
  2. 生成一个关联xml文档的输入流:
    new InputStreamReader(new FileInputStream(File),“UTF-8”)
  3. 生成Document对象(加载xml到SAXBuilder中):builder.build(isr) → Document
  4. 获取根节点:doc.getRootElement() → Element
  5. 获取根节点下的子节点,遍历:root.getChildren()
  6. 获取节点的所有属性,遍历:ele.getAttributes()
    > 获取属性和值:attr.getName()/getValue()
  7. 获取节点的文本数据:ele.getText()
DOM4J 解析
  1. 生成SAXReader对象:new SAXReader()
  2. 生成Document对象(加载xml文件):reader.read(File)
  3. 获取根节点:doc.getRootElement()
  4. 获取节点的迭代器,遍历:ele.elementIterator() → Iterator
  5. 获取节点的所有属性,遍历:ele.getAttributes()
    > 获取属性和值:attr.getName()/getValue()
  6. 获取节点的文本数据:ele.getText()
生成xml文档

用文档的内容建立一个DOM树,然后写出树的各个内容。

  1. 创建一个空文档:DocumentBuilder对象.newDocument() → Document
  2. 创建元素:doc.createElement(元素名)
  3. 创建文本节点:doc.createTextNode(文本内容)
  4. 将根节点添加给文档:doc.appendChild(root)
  5. 将子节点添加给父节点:root.appendChild(child)
  6. 设置元素的属性值:root.setAttribute(name,val)
  7. 设置节点的文本内容:root.setTextContent();
  8. 生成xml文件
//方式一:使用Transformer将document转换成xml
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer =factory.newTransformer();
transformer.transform(new DOMSource(document),newStreamResult("books.xml"));

//方式二:使用XmlSerializer将xml序列化
FileOutputStream os = new FileOutputStream("books.xml");
//将document格式化
OutputFormat format = new OutputFormat(document);
XMLSerializer xmlSerilizer = new XMLSerializer(os, format);
//序列化document得到xml
xmlSerilizer.serialize(document); 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值