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. SSH项目里面 忘记密码的邮件发送功能

    package com.xxx.util; import java.util.Date; import java.util.Properties; import javax.mail.Address; ...

  2. Socket编程实践(1) 基本概念

    1. 什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口.TCP/IP协议的底层部分已经被内核实现了,而应用层是用户需要实现的,这部分程序工作在用户空间.用户空间的程序需要通 ...

  3. java 引用传递及基本应用

  4. 简明 VIM 练级攻略

    http://coolshell.cn/articles/5426.html vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个 ...

  5. Android SDK NDK开发总结

    描述:http://talent.baidu.com/external/baidu/index.html#/jobDetail/2/1237247043 android studio实现Jni(C/C ...

  6. java -- 容易放错的误区

    1.按值传递 和 引用传递 (基本类型包括基本类型的包装类 或者 字符串类型 传递的是 副本 并不会改变原来的值)||  如果是引用类型 传递的是地址,会改变原来的值. public class T ...

  7. MTK MT33xx型GPS的NMEA协议解析实例

    1)解析实现 gps_main.c #include <nmea/nmea.h> #include <string.h> #include <stdio.h> #i ...

  8. CSS的选择器

    <div id="demo"> <div class="inner"> <p><a href="#" ...

  9. Spring,Mybatis 整合Memcache

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...

  10. 项目中运行报错: Loading XML bean definitions from class path resource [applicationContext.xml]

    记录一下: org.springframework.context.support.AbstractApplicationContext prepareRefresh Refreshing org.s ...