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. 基于Visual Studio Code搭建Golang开发调试环境【非转载】

    由于对Docker+kubernetes的使用及持续关注,要理解这个平台的原理,势必需要对golang有一定的理解,基于此开始利用业余时间学习go,基础语法看完之后,搭建开发环境肯定是第一步,虽然能g ...

  2. Android动态加载框架汇总

    几种动态加载的比较 1.Tinker 用途:热修复 GitHub地址:https://github.com/Tencent/tinker/ 使用:http://www.jianshu.com/p/f6 ...

  3. oracle新建登录用户sql语句

    CREATE TABLESPACE TEST_DBDATAFILE '/mnt/data/oracledata/TEST_DB .dbf' SIZE 5000M AUTOEXTEND ONUNIFOR ...

  4. grails项目获取前后台的值

    grails项目中前台传值给后台: 加入我有a.gsp这个页面,a.gsp中有如下代码: 姓名:<input type="text" name="xing" ...

  5. Jquery 循环map的用法

    $.each(map,function(key,values){console.log(key);$(values).each(function(){console.log("\t" ...

  6. Android 样式 (style) 和主题(theme)

    转载:https://gold.xitu.io/post/58441c48c59e0d0056a30bc2 样式和主题 样式是指为 View 或窗口指定外观和格式的属性集合.样式可以指定高度.填充.字 ...

  7. 【BZOJ-2555】SubString 后缀自动机 + LinkCutTree

    2555: SubString Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1936  Solved: 551[Submit][Status][Di ...

  8. Noise Contrastive Estimation

    Notes from Notes on Noise Contrastive Estimation and Negative Sampling one sample: \[x_i \to [y_i^0, ...

  9. js

    1.判断是否为空 if (typeof(a)!="undefined") 2. pop()移除数组最后一个元素 var arr = [];   $('#tableid tr').f ...

  10. C#通过WebClient/HttpWebRequest实现http的post/get方法

    C#通过WebClient/HttpWebRequest实现http的post/get方法 http://www.cnblogs.com/shadowtale/p/3372735.html