XML简介

围绕XML涉及到四方面的技术:

1、数据定义Schema、DTD

2、数据解析DOM、SAX两种解析模型

3、样式风格XSTL,使用XSTL可以将XML文件中存放的内容按照指定的样式显示为HTML页面

4、实现语言JAVA,NET,JavaScript等,几乎所有的程序语言都提供支持。所有操作XML的功能都有额外的语言提供。另Java中可以使用SAX、JDOM、dom4j等API操作XML数据。

基本语法:

声明<?xml version=”1.0” encoding=”UTF-8”?>

XML声明不属于xml元素,所以不需要结束标记。

XML文档只有一个根元素,必须包含一个单独的标记来定义整个文档。

XML是大小写敏感的。

转移字符:当某个节点的数据包含大量需要转义的字符时,可以使用CDATA

以结束,其所包含的文本都会被当做普通文本处理,所有的特殊符号都会被忽略掉。但其中不能再包含CDATA,注意标签不能有空格。

XML解析

DOM解析

DOM解析(Document Object Mode)是一种基于对象的API,它把XML的内容加载到内存中,生成一个与XML文档内容对应的对象模型。当解析完成时,内存中会生成与XML文档的结构对应的DOM对象树。这样便能够根据树的结构,以节点形式来对文档进行操作。

特点:对于小的XML文件这样处理很方便,但遇到大的XML文件时,DOM解析占用内存比较大,而且查找速度比较慢。

通过以下三个步骤创建XML文件对应的Document对象:

DocumentBuilderFactorybuilderFactory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder =builderFactory.newDocumentBuilder();

Document document = builder.parse(file);

其他方法可参考JDK,javax.xml.*; org.w3c.dom.

SAX解析

SAX解析器对XML文档解析会从XML文档开始位置起进行解析,同时根据已经定义好的事件处理器,来决定当前所解析的部分(元素、属性或元素内容)是否有必要记录并存储。

特点:效率比DOM解析优越。

SAX解析是事件驱动的,需要定义一个事件监听对象(可继承DefaultHandler类)

通过如下三个步骤建立XML解析对象:

SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser parser = factory.newSAXParser();

parser.parse(newFile(""),newDefaultHandler());

其他具体方法可参考JDK:org.xml.sax.*; javax.xml.parsers.

DOM和SAX都是JDK提供的解析XML的API,但是在实际开发中很少用到,因为要重新编写大量的代码。

XML与Java类(POJO类)映射JAXB

Java对象转化成XML,marshal

XML转化为Java对象,unmarshal

此方法也是JDK提供的:javax.xml.bind.*

注解:

Dom4j

dom4j的一个工具类:package com.xml.dom4j;

import java.io.FileWriter;

import java.io.IOException;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.XPath;

import org.dom4j.io.OutputFormat;

import org.dom4j.io.XMLWriter;

/**

*dom4j的学习可参考官网

*下载官网:

*http://sourceforge.net/projects/dom4j/files/dom4j-2.0.0-ALPHA-2/

*学习详细用法可参考具体官方API接口文档说明

*/

public class XmlUtil {

/**

* tagName=list

* 理解element是什么东西

* Element interface defines an XML element.

* An element can have declared namespaces, attributes, child nodes and textual content

* http://hi.daidu.com/331703405/item/d3a7388916fcc8d75e0c1d1

* @param document

* @param nameSpace

* @param tagName

* @return

*/

public static List getElementsByNameSpace(Document document, String nameSpace, String tagName){

Map map = new HashMap();

map.put("ns", nameSpace);

XPath xPath = document.createXPath("//ns:" + tagName);

xPath.setNamespaceURIs(map);

List list = xPath.selectNodes(document);

return list;

}

/**

* 一般项目处理的时候也可用字符串StringBuffer拼接报文

* 当大量的xml需要的时侯可用模板Freemarker模块

* @param document

* @throws IOException

* 来自官网API说明文档

*/

public void write(Document document) throws IOException {

// lets write to a file

XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));

writer.write(document);

writer.close();

// Pretty print the document to System.out

OutputFormat format = OutputFormat.createPrettyPrint();

writer = new XMLWriter( System.out, format);

writer.write(document);

// Compact format to System.out

format = OutputFormat.createCompactFormat();

writer = new XMLWriter(System.out, format);

writer.write(document);

}

/**

* tagPaht = root.response.list

* @param document

* @param tagPath

* @return

*/

public static List getElementsByTagPath(Document document, String tagPath){

List list = null;

Element root = document.getRootElement();

String[] tags = tagPath.split("\\.");

if(tags[0].equals(root.getName())){

Element element = root;

for (int i = 1; i < tags.length; i++) {

if(i < tags.length - 1){

element = element.element(tags[i]);

if(element == null) break;

}else{

list = element.elements(tags[i]);

}

}

}

return list;

}

/**

* 通过路径获取标签值

* tagPath = root.response.name

* @param document

* @param tagPath

* @return

*/

public static String getElementTextByTagPath(Document document, String tagPath){

String text = "";

Element root = document.getRootElement();

String[] tags = tagPath.split("\\.");

if(tags[0].equals(root.getName())){

Element element = root;

for (int i = 1; i < tags.length; i++) {

if(i < tags.length - 1){

element = element.element(tags[i]);

if(element == null) break;

}else{

text = element.elementText(tags[i]);

}

}

}

return text;

}

}

JDOM

java对xml文件的解析_Java对XML文件的解析相关推荐

  1. java怎么xml文件解析_Java对Xml文件解析

    JAVA 解析 XML 通常有两种方式,DOM 和 SAX. DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一 ...

  2. java 文件提前结束_java – org.xml.sax.SAXParseException:过早结束文件

    我目前有以下 XML文件. 我的XMLParser.java类. package edu.unsw.comp9321.assignment1; import java.io.File; import ...

  3. java资源文件获取属性_Java读写资源文件类Properties

    Java中读写资源文件最重要的类是Properties 1) 资源文件要求如下: 1.properties文件是一个文本文件 2.properties文件的语法有两种,一种是注释,一种属性配置. 注  ...

  4. java实现xml的xsd验证_Java通过XML Schema校验XML

    首页 > 编程语言> 文章详细 Java通过XML Schema校验XML 2020-03-28 10:51:10阅读:77来源:互联网 Java通过XML Schema校验XML XML ...

  5. java读取文件并输出_java读取txt文件并输出结果

    这篇文章主要介绍了java读取txt文件并输出结果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 描述: 1.java读取指定txt文件并解析 文件 ...

  6. java如何处理csv文件上传_java处理csv文件上传示例

    前言:示例只是做了一个最最基础的上传csv的示例,如果要引用到代码中去,还需要根据自己的业务自行添加一些逻辑处理. ReadCsvUtil工具类 package com.hanfengyeqiao.g ...

  7. java搜索文件夹中文件是否存在_java中判断文件文件夹是否存在的方法(附代码)...

    1.判断文件夹是否存在,不存在则创建:(java相关视频教程推荐:java视频教程)File folder = new File("d:est1est2"); if (!folde ...

  8. java pdf水印排布问题_Java实现pdf文件添加水印,铺满全页。

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/duan1309/article/details/81232300 因项目需要将word文件(.doc ...

  9. java列出文件正则过滤_JAVA正则表达式过滤文件的实现方法

    java正则表达式过滤文件的实现方法 正则表达式过滤文件列表,听起来简单,如果用java实现,还真需要一番周折,本文简析2种方式 1.适用于路径确定,文件名时正则表达式的情况(jdk6的写法) Str ...

最新文章

  1. Python语言学习:Python随机生成那些事之随机生成使用方法、案例应用之详细攻略
  2. CV之face_recognition:Py之face_recognition库安装、介绍、使用方法详细攻略
  3. pandas apply()函数参数 args
  4. 安卓BLE开发教程(一) BLE基础
  5. java cxf 不使用springmvc_使用cfx与springMVC集成发布与调用webservice
  6. docker 安装mysql_Docker安装MySQL完整版流程
  7. Single Page Applications in ASP.NET MVC 4
  8. SE 2014 年4月21日(二)
  9. 开启xmp1还是2_原神风魔龙技能打法详细教程攻略 奇货匣开启次数是否保留会刷新吗...
  10. smartadmin的php配置本,laravel-admin自动生成模块,及相关基础配置方法
  11. ggplot做双曲线阈值火山图
  12. 变量之间的相关性度量
  13. ARM微控制器与嵌入式系统
  14. 用计算机唱歌弹奏china,新目标英语专题练习:句型转换(附答案)
  15. 【mysql】HikariCP不断打印WARN日志Failed to validate connection JDBC4Connectio Possibly consider using a shor
  16. 分享一些C++软件开发后台开发复习必备电子书单
  17. 米兔机器人魔方_米兔卡片学习机首晒
  18. 一加手机救砖资源-sahara通信失败 或者 checkHwid failed都是由于使用错了救砖包
  19. Perl-字符串与排序2
  20. 信息收集——系统识别及版本确定

热门文章

  1. Qt for Android调用android原生Toast控件
  2. ARM 之四 各集成开发环境(IDE)说明(Keil、RVDS、ADS、DS-5、MDK)
  3. Linux C : GDB调试命令汇总
  4. java通过按钮打开新窗口_如何在java程序中,当点击一个按钮后,关闭当前窗口,开启一个新的窗口。...
  5. python简单超级马里奥游戏下载_python 实现超级玛丽游戏
  6. android gridview控件使用详解_作为Android 开发者该如何进阶?
  7. python3默认使用的编码是_python3里的中文编码是什么?
  8. linux某个目录环境变量,在linux下加环境变量或者是把某个目录加到环境变量
  9. 【AI呀,我去】科技圈顶流——元宇宙上线,快来揭开它的神秘面纱
  10. require与include+php,PHP中include与require有什么区别