dom4j使用总结
2024-10-19 07:35:36
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;
}
}
最新文章
- Ixia测试仪的自动化
- 汇编语言--寄存器(cpu工作原理)
- Unity3D研究院之使用Animation编辑器编辑动画
- 跨域iframe高度自适应(兼容IE/FF/OP/Chrome)
- Android 布局 中实现适应屏幕大小及组件滚动
- SQL Server索引进阶:第十二级,创建,修改,删除
- MVC @Html控件
- HDU2093--考试排名
- [ Android 五种数据存储方式之二 ] —— 文件存储数据
- 《程序员的职业素养》【PDF】下载
- 使用Maven插件构建Spring Boot应用程序镜像
- kali安装Google浏览器之后的问题
- 0 or 1,1 and 0
- 【TP3.2】TP3.2的 FIND_IN_SET()的用法
- oracle导入导出dmp 解决exp-00011
- [java] jar file
- Npoi将excel数据导入到sqlserver数据库
- angularJS修改 品优购修改品牌(新增和修改用同一个方法)
- poj3417 Network 树上差分+LCA
- 【数形结合】Gym - 100923I - Por Costel and the Pairs