XML文档处理
1)CDATA部分用<![CDATA[和]]>来限定其界限,它们是字符数据的一种特殊形式,可用使用它们来囊括那些含有<、>,&之类字符的字符串,而不必将它们解释为标记例如:<![CDATA[<]]>,另外需要注意的是CDATA部分不能包含字符串]]>。
2)处理指令(processing instruction)专门处理XML文档的应用程序中使用的指令,它们用<?和?>来限定其界限。例如:<?xml version="1.0"?>。
3)注释 使用<!--和-->限定其界限。
4)解析XML文档有两种类型的解析器一种是树形解析器(DOM),另外一种流机制解析器(SAX),首先介绍树形解析器。
包名:org.w3c.dom
DOM解析器的接口已经被W3C标准化,org.w3c.dom包包含了解析时用各种对象以及方法。解析xml文档首先要创建Document对象,如何创建请看例子:
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc=builder.parse(f);
parse方法中的参数可以是文件或者是流,可以通过调用getDocumentElement方法获取xml文档的根元素,调用getTagName()获取元素的名字,getChildNodes()获取节点列表NodeList,调用getTextContent()获取元素的文本值。
例子:
//根元素
Element root=doc.getDocumentElement();
// 返回节点的集合
NodeList nodeList=root.getChildNodes();
// 返回集合中子节点数
int count=nodeList.getLength();
//获取元素的名字
String rootName=root.getTagName();
//获取元素的文本值包括其子元素
String rootText=root.getTextContent();
可用instanceof判断节点是否是元素,由于Text类型的节点是终结节点,可以用getData获取Text节点中的字符串,对getData返回的值最好调用trim方法,过滤掉空字符。
for (int i = 0; i < nodeList.getLength(); i++) {
//获取单个节点
Node childNode = nodeList.item(i);
//判断是否是元素,
if (childNode instanceof Element) {
Element element = (Element) childNode;
//childNode只有一个子节点且子节点是Text类型的 例子:<name>zhangsan<name>
//Text节点是指的"zhangsan"节点
Text textNode = (Text) element.getFirstChild();
//调用getData获取其文本值
String textString = textNode.getData().trim();
}
else{
// TODO 其他处理
}
5)XPath定位信息
包名:javax.xml.xpath.XPath
获取XML文档中某一节点的值,如果遍历整个DOM树的节点来查找比较麻烦的,但是使用XPath语言可以轻松的得到指定的节点值或属性值。
XPath可以描述XML文档中一个节点的集,例如,XPath:/gridbag/row,描述了根元素gridbag的子元素中所有的row元素,可以用[]操作符来选择特定的元素:/gridbag/row[1]这表示的是第一行(索引号从1开始),使用@操作符可以获得属性值,例如:/gridbag/row[1]/@anchor,获取第一行row元素属性anchor的值。
XPath表达式是如何创建和使用的,接下来看一段代码就会明白了:
XPathFactory xPathFactory=XPathFactory.newInstance();
XPath xPath=xPathFactory.newXPath();
//evaluate 返回的是字符串,所以很适合用来获取文本值
String value= xPath.evaluate("/gridbag/row[1]", doc);
evaluate第一个参数XPath表达式,第二参数是DOM对象。
6)流机制解析器
包名:javax.xml.stream
StAX解析器是一种“拉解析器(pull parser)”,使用下面的基本循环来迭代所有的事件即可:
InputStream in=new FileInputStream("G:\\test.xml");
XMLInputFactory factory=XMLInputFactory.newInstance();
XMLStreamReader parser=factory.createXMLStreamReader(in);
while (parser.hasNext()) {
// event 对应事件的值
int event=parser.next();
// 元素 处理
if (event==XMLStreamConstants.START_ELEMENT) {
String elementNameString=parser.getLocalName();// 元素名称
String elementValueString=parser.getText();// 元素值
// TODO
}
// Call parser methods obtain event details
}
7)完整示例:
循环读取xml文档属性及节点值并已key-value形式存入hashmap中
package com; import org.w3c.dom.*;
import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;
import java.util.HashMap; /**
* 解析xml文件
* Created by ysp on 2018-09-17.
*/
public class XmlUtils { private static final String XML_PATH = "src/main/resources/com/xmlUtils.xml"; private static HashMap<String, String> hashMap = new HashMap<String, String>(); /**
* 获取HashMap
* @return
*/
public HashMap<String,String>getHashMap() {
try {
Document document = getDocument();
Element root = document.getDocumentElement();
putElements(root);
} catch (IOException io) {
io.printStackTrace();
System.out.println("IOException:" + io.getMessage());
} catch (ParserConfigurationException parser) {
parser.printStackTrace();
System.out.println("ParserConfigurationException:" + parser.getMessage());
} catch (SAXException sax) {
sax.printStackTrace();
System.out.println("SAXException:" + sax.getMessage());
} finally {
return hashMap;
}
} /**
* 遍历每个节点并放入hashmap中
* @param root
* @return
* @throws IOException
* @throws ParserConfigurationException
* @throws SAXException
*/
private HashMap<String,String> putElements(Element root)throws IOException,ParserConfigurationException,SAXException {
NodeList nodeList = root.getChildNodes();
int nodeLen=nodeList.getLength();
for (int n = 0; n < nodeLen; n++) {
Node node = nodeList.item(n);
if (node instanceof Element) {
Element element = (Element) node;
//属性值
NamedNodeMap namedNodeMap = element.getAttributes();
int lenAttr = namedNodeMap.getLength();
for (int i = 0; i < lenAttr; i++) {
Node node1 = namedNodeMap.item(i);
String k = node1.getNodeName().trim();
String v = node1.getNodeValue().trim();
if (!k.isEmpty() && !v.isEmpty() && !hashMap.containsKey(k)) {
hashMap.put(k, v);
}
}
if(element.hasChildNodes()){
putElements(element);
}
}
else if(node.getNodeType()==Node.TEXT_NODE){
Text text = (Text) node;
String v = text.getData().trim();
String k = text.getParentNode().getNodeName().trim();
if ((!k.isEmpty()) && (!v.isEmpty()) && (!hashMap.containsKey(k))) {
hashMap.put(k, v);
}
}else{
continue;
}
}
return hashMap;
} /**
* 实例化Document对象
* @return
* @throws ParserConfigurationException
* @throws SAXException
* @throws IOException
*/
private Document getDocument()throws ParserConfigurationException,SAXException,IOException {
try {
String filePath = this.getClass().getClassLoader().getResource("com/xmlUtils.xml").getFile(); File file=new File(filePath);
DocumentBuilder builder=getBuilder();
Document document = builder.parse(file);
return document;
}catch (Exception ex){
ex.printStackTrace();
}
return null;
} /**
* 实例化DocumentBuilder 对象
* @return
* @throws ParserConfigurationException
*/
private DocumentBuilder getBuilder() throws ParserConfigurationException{
DocumentBuilderFactory documentBuilderFactory= DocumentBuilderFactory.newInstance();
documentBuilderFactory.setIgnoringElementContentWhitespace(true);
documentBuilderFactory.setExpandEntityReferences(false);
DocumentBuilder builder=documentBuilderFactory.newDocumentBuilder();
return builder;
}
}
XML文档处理的更多相关文章
- C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”
Q: 在反序列化 Xml 字符串为 Xml 对象时,抛出如下异常. 即在 XML文档(0, 0)中有一个错误:缺少根元素. A: 首先看下代码: StringBuilder sb = new Stri ...
- 【.net 深呼吸】使用二进制格式来压缩XML文档
在相当多的情况下,咱们写入XML文件默认是使用文本格式来写入的,如果XML内容是通过网络传输,或者希望节省空间,特别是对于XML文档较大的情况,是得考虑尽可能地压缩XML文件的大小. XmlDicti ...
- 【Win 10应用开发】把文件嵌入到XML文档
把文件内容嵌入(或存入)到XML文档中,相信很多朋友会想到把字节数组转化为Base64字符串,再作为XML文档的节点.不过,有人会说了,转化后的base64字符串中含有像“+”这样的符号,写入到XML ...
- 用ORM的思想操作XML文档,一个对象就搞定不要太简单。滚蛋吧!XmlDocument、XmlNode、Xml***……
大家有没有这样的感受,一涉及XML文档操作就得百度一遍.是不是非!常!烦!.各种类型,各种方法,更别提为了找到一个节点多费劲.本来想写个XML操作的工具方法,写了两行一想既然XML文档是有规律的,如果 ...
- 【Win10 应用开发】自适应Toast通知的XML文档结构
老规矩,在开始之前老周先讲个故事. 话说公元2015年7月20日,VS 2015发布.于是,肯定有人会问老周了,C#6有啥新特性,我学不来啊.学不来的话你应该检讨.老周比较保守地计算一下,学会C# 6 ...
- XML文档操作集锦(C#篇)
在JSON没流行起来的时候xml一直作为程序存储配置信息的主流介质:特别是小型数据表方面还是不错的选择,所以经常涉及到的操作无非也就是增删改查,这篇博客主要是对这些对比较常用的操作做了个简单的总结 文 ...
- XmlReader和XElement组合之读取大型xml文档
简介 在.NET framework 中存在大量操作xml数据的类库和api,但在.NET framework 3.5后我们的首选一般就是linq to xml. linq to xml操作xml数据 ...
- Java获取XML节点总结之读取XML文档节点
dom4j是Java的XML API,用来读写XML文件的.目前有很多场景中使用dom4j来读写xml的.要使用dom4j开发,需要下载导入dom4j相应的jar文件.官网下载:http://www. ...
- 使用sp_xml_preparedocument处理XML文档
有时会在存储过程中处理一些XML格式的数据,所以会用到sp_xml_preparedocument,他可以将XML数据进行读取,然后使用 MSXML 分析器 (Msxmlsql.dll) 对其进行分析 ...
- 解析txt文本,dom4j工具输出为xml文档
有如下一个ttl.txt文本文档,每一行用空格隔开的三段分别代表主谓宾, 要将它们输出为xml格式文档 工具:dom4j,jar包导入MyEclipse的Java Project工程 代码如下: pa ...
随机推荐
- Spark应用(app jar)发布到Hadoop集群的过程
记录了Spark,Hadoop集群的开启,关闭,以及Spark应用提交到Hadoop集群的过程,通过web端监控运行状态. 1.绝对路径开启集群 (每次集群重启,默认配置的hadoop集群中tmp文件 ...
- 慧都启动“正版IDE联合超值推广计划
越来越多的中国软件企业为盗版所害而蒙受巨大损失,正版化意识逐渐兴起.IDE(集成开发环境)是软件开发.编写代码必备工具,而正版IDE更具有运行更稳定.编码更安全.保障更加完善等特点,逾为中国软件行业企 ...
- mybooklist 日志5.12
这是一个很悲伤的日子. 今天,我不发朋友圈了.可手头的工作还是要做的,虽然说这是工作,也不能完全算. 在上班的时间做的事情,可以称得上工作,可这不是老板交给我做的事情.国有企业领导很两难,老板你是要辞 ...
- Nginx+Tomcat在Windows下做负载均衡
一. 为什么需要对Tomcat服务器做负载均衡 Tomcat服务器作为一个Web服务器,其并发数在300-500之间,如果有超过500的并发数便会出现Tomcat不能响应新的请求的情况,严重影响网站的 ...
- CentOS7 查询已安装的包方便整理 /卸载
以PHP为例.首先查看已安装的PHP rpm -qa |grep php 输出结果: php-cli--.el7.x86_64 php-common--.el7.x86_64 查询rpm包的安装时间和 ...
- React总结和遇到的坑
一.react项目 前端react后端node:https://github.com/GainLoss/react-juejin 前端react后端Pyton:https://github.com/G ...
- Git的认识与学习
第一部分:我的git地址是https://github.com/monkeyDyang 第二部分:我对git的认识 Git是一种良好的.支持分支管理的代码管理方式,能很好地解决团队之间协作的问题.每个 ...
- 如何处理错误信息 Pricing procedure could not be determined
当给一个SAP CRM Quotation文档的行项目维护一个产品时,遇到如下错误信息:Pricing procedure could not be determined 通过调试得知错误消息在fun ...
- 简单的PHP算法题
简单的PHP算法题 目录 1.只根据n值打印n个0 2.根据n值打印一行 0101010101010101010101…… 3.根据n值实现1 00 111 0000 11111…… 4.根据n值实现 ...
- FreeImage.lib库的配置和简单使用 转
转载地址 http://www.codeweblog.com/win8-1%E4%B8%8Bfreeimage-lib%E5%BA%93%E7%9A%84%E9%85%8D%E7%BD%AE%E5%9 ...