1.加载Xml

从文件加载

 SAXReader reader = new SAXReader();
String filePath = "/xmlfile/" + fileName + ".xml";
Document document = null;
try {
document = reader.read(ProcessXmlUtil.class.getResourceAsStream(filePath));
} catch (DocumentException e) {
logger.error("error:", e);
}
return document;

通过字符串转换

Document document = DocumentHelper.parseText(xmlString);

2.验证

 /**
* 通过XSD验证xml的准确性
*
* @param xsdFileName xsd路径 要全路径
* @param xmlString xml文件
* @return
*/
public static String validateXsd(String xsdFileName, String xmlString) {
try {
XMLErrorHandler handler = new XMLErrorHandler();
//获取基于 SAX 的解析器的实例
SAXParserFactory factory = SAXParserFactory.newInstance();
//解析器在解析时验证 XML 内容。
factory.setValidating(true);
//指定由此代码生成的解析器将提供对 XML 名称空间的支持。
factory.setNamespaceAware(true);
//使用当前配置的工厂参数创建 SAXParser 的一个新实例。
SAXParser parser = factory.newSAXParser();
//创建一个读取工具
//获取要校验xml文档实例
Document document = DocumentHelper.parseText(xmlString);
parser.setProperty(
"http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
parser.setProperty(
"http://java.sun.com/xml/jaxp/properties/schemaSource",
"file:" + xsdFileName);
//创建一个SAXValidator校验工具,并设置校验工具的属性
SAXValidator validator = new SAXValidator(parser.getXMLReader());
//设置校验工具的错误处理器,当发生错误时,可以从处理器对象中得到错误信息。
validator.setErrorHandler(handler);
//校验
validator.validate(document); XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());
if (handler.getErrors().hasContent()) {
logger.error("XML文件通过XSD文件校验失败!");
writer.write(handler.getErrors());
String error = "";
for (Node node : handler.getErrors().content()) {
error += node.asXML() + System.getProperty("line.separator");
}
return error;
} else {
logger.info("XML文件通过XSD文件校验成功!");
}
return "";
} catch (Exception ex) {
logger.error("XML文件通过XSD文件:" + xsdFileName + "检验失败。\n原因: " + ex.getMessage());
return ex.getMessage();
}
}

注意,验证xsd的路径名要是完整的全路径,如e://xml/xsd/test.xsd

3.Xpath

<?xml version="1.0" encoding="utf-8" ?>
<root>
<name value="张三">
<address>福建省厦门市XXX</address>
</name>
</root>

获取值:福建省厦门市XXX

document.selectSingleNode("//name/address").getText();

获取name的属性value

document.selectSingleNode("//name/@value").getText();

命名空间的处理:当XML有命名空间时,Xpath的查询也要加上命名空间,且只能查询一个层级

  Map map = new HashMap();
map.put("ns", nameSpace);
XPath x = newXmlDoc.createXPath("//ns:name");

这里只查询一级name是有值的,但是如果想同时查询name下面的address,则返回的是空

 Map map = new HashMap();
map.put("ns", nameSpace);
XPath x = newXmlDoc.createXPath("//ns:name");
x.setNamespaceURIs(map);
Node node= (x.selectSingleNode(rootNode));//有值
x = newXmlDoc.createXPath("//ns:name/address");
Node node2= (x.selectSingleNode(rootNode));//值为空

如果想查询address上的值,则必须在name节点上查询,如

 Map map = new HashMap();
map.put("ns", nameSpace);
XPath x = newXmlDoc.createXPath("//ns:name");
x.setNamespaceURIs(map);
Node node= (x.selectSingleNode(rootNode));//有值
x = newXmlDoc.createXPath("//ns:address");
x.setNamespaceURIs(map);
Node node2= (x.selectSingleNode(node));//有值

所以想一次性用Xpath查询,最好先把命名空间去掉

4.增加命名空间

  Document newXmlDoc = DocumentHelper.createDocument();
//头部构建
Element rootNode = newXmlDoc.addElement(strMsgModelCode);
rootNode.addNamespace("", nameSpace);

第一个参数是空

5.在固定节点插入

要循环遍历节点,然后调用elements.add方法。这个真没有.net的linq to xml方便。

List<Element> elements = rootNode.elements();
int index = 0;
for (Element element : elements) {
index++;
if ("name".equals(element.getName())) {
elements.add(index, responseEle);
break;
}
}

dom4j使用总结的更多相关文章

  1. XML技术之DOM4J解析器

    由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ...

  2. 四种解析和创建方式(DOM,SAX,DOM4J,JDOM)

    一.先导入jar包 DOM基于树形,SAX基于事件,DOM4J和JDOM基于底层API 二.代码如下 1 package com.sxt.test; import java.io.File; impo ...

  3. dom4j的小例子

    1.要解析的xml文件book.xml <?xml version="1.0" encoding="UTF-8"?> <books> & ...

  4. Dom4J解析技术

    前面的话  本文主要讲解有关Dom4j技术和xpath配合下的优化!   目录:    为什么需要Dom4J    DOM4J怎么用    xpath怎么配合DOM4J 一  为什么需要Dom4J 一 ...

  5. Dom4j解析xml文件

    dom4j是一个Java的XML API,类似于jdom,用来读取的XML文件,由于它是将文件解析完存放在内存当中的,所以不适合解析大的XML文件,但就方便性和性能方面,一定程度要优于JDK中Domc ...

  6. java dom4j封装和解析XML

    package org.scbit.lsbi.scp.utils; import java.util.ArrayList; import java.util.List; import org.dom4 ...

  7. xml之dom4j解析

    * 使用dom4j解析xml 实例在java520里面 TextDom4j * dom4j,是一个组织,针对xml解析,提供解析器dom4j * dom4j不是javase的一部分,想要使用第一步需要 ...

  8. 使用dom4j读取xml连接数据库与之单例模式

    使用dom4j读取xml ,加入jar包 dom4j-1.6.1.jar jaxen-1.1-beta-6.jar public class XmlConfigReader { //懒汉式,延迟加载 ...

  9. dom4j解析示例

    收藏信息.xml <?xml version="1.0" encoding="GB2312" standalone="no"?> ...

  10. java DOM4J 读取XML

    最近学习Java,在处理XML文档的时候,查阅相关资料,发现了DOM4J这个jre库,相对C#的XML处理来说,功能还算是跟得上 下面展示一篇我自己写的一个XML读取测试 import java.ut ...

随机推荐

  1. Entity Framework 6连接Postgresql、SQLite、LocalDB的注意事项和配置文件

    Postgresql Postgresql支持Code First的方式自动生成表,不过默认的模式是dbo而不是public,而且还可以自动生成自增主键. <?xml version=" ...

  2. Apache报错信息之通常每个套接字地址(协议/网络地址/端口)只允许使用一次(could not bind to address 0.0.0.0:80)

    我们常常在执行 httpd –k restart 重启Apache时报错提示: (OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次.  : AH00072: make_soc ...

  3. ASE周会记录

    本周Sprint Master Atma Hou 一. 本周会议概要 本次会议的主要任务是明确和老师讨论后的数据库设计定稿,同时为我们接下来的连接工作确定包含实现细节的story和接口. 二. 会议内 ...

  4. 把 SQL Server 迁移到 Linux?不如换成 MySQL

    最近几年,数量庞大的个人和组织放弃 Windows 平台选择 Linux 平台,而且随着人们体验到更多 Linux 的发展,这个数字将会继续增长.在很长的一段时间内, Linux 是网络服务器的领导者 ...

  5. Ubuntu学习总结-09 安装 Pycharm

    一 下载 PyCharm 从以下网址下载Linux版本的Pycharm,这里使用的版本是pycharm-professional-2016.2.3.tar.gz . http://www.jetbra ...

  6. Redis之个人简单理解

    1.什么是redis? 在过去的几年中,NoSQL数据库一度成为高并发.海量数据存储解决方案的代名词,与之相应的产品也呈现出雨后春笋般的生机.然而在众多产品中能够脱颖而出的却屈指可数,如Redis.M ...

  7. 在使用 vscode 时 eslint 检测 .vue 文件中的less 部分内容

    问题: 在使用 vscode 以及 eslint 来检测 基于 webpack 的 vue-cli 的项目中,eslint 无法检测到 .vue 文件中的less 部分内容. 解答: 1.通过 下载 ...

  8. leetcode笔记

    82. Remove Duplicates from Sorted List II https://leetcode.com/problems/remove-duplicates-from-sorte ...

  9. 影响postgresql性能的几个重要参数

    转载 一篇蛮老的文章了,但是还是很有用,可参考修补. PG的配置文件是数据库目录下的postgresql.conf文件,8.0以后的版本可支持K,M,G这样的参数,只要修改相应参数后重新启动PG服务就 ...

  10. 用C#创建Windows服务(Windows Services)

    用C#创建Windows服务(Windows Services) 学习:  第一步:创建服务框架 创建一个新的 Windows 服务项目,可以从Visual C# 工程中选取 Windows 服务(W ...