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. 【Codeforces 738B】Spotlights

    Theater stage is a rectangular field of size n × m. The director gave you the stage's plan which act ...

  2. 北京培训记day5

    高级数据结构 一.左偏树&斜堆 orz黄源河论文 合并,插入,删除根节点 打标记 struct Node { int fa,l,r,w,dep } tree[Mx]; int Merge(in ...

  3. favicon.ico 404的问题(title栏前面的图标)

    1.页面中自定义图标 去  http://www.bitbug.net/   定制图片,有32*32,16*16等样式可供选择 2.在页面中引入定义的图片 <link rel="sho ...

  4. JS控制,返回上一页之后强行刷新一次

    网站建设过程中,提交页面后我们经常要用到window.history.go(-1)返回上一页,因为页面的缓存功能,我们只能返回上次操作的页面,但在删除等操作中,我们希望实时看到删除项目后的页面,这就要 ...

  5. NodeJS 学习总结 01 安装配置

    1 安装NodeJS 具体参考已发布的文章Ubuntu学习总结-07 Nodejs和npm的安装 2 使用淘宝 NPM 镜像 国内直接使用 npm 的官方镜像是非常慢的,这里推荐使用淘宝 NPM 镜像 ...

  6. [Unity3D]UI界面之瞄准镜设置说明

    9空格设计 : 比如说4个角的图案固定,拉伸的时候不受影响 通过设置 左上右下来: 通过创建Image对象,将设置好的图片关联到Source Image 调整瞄准镜跟随飞机, 注意这里设置的Z轴向量是 ...

  7. NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters

    /******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...

  8. JS 工具类

    之前工作用的JavaScript比较多,总结了一下工具类,和大家分享一下,有不足之处还请多多见谅!! 1. 数组工具类(arrayUtils) var arrayUtils = {}; (functi ...

  9. CenterOS 7 常用命令

    1.防火墙开放端口      1.1 开启端口        # firewall-cmd --zone=public --add-port=80/tcp --permanent          1 ...

  10. SQL语句判断数据库、表、字段是否存在

    from master..sysdatabases where name='TestDB')    print 'TestDB存在'else    print 'TestDB不存在' --判断表[Te ...