博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dom4j使用总结
阅读量:4489 次
发布时间:2019-06-08

本文共 4271 字,大约阅读时间需要 14 分钟。

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

福建省厦门市XXX

获取值:福建省厦门市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
elements = rootNode.elements(); int index = 0; for (Element element : elements) { index++; if ("name".equals(element.getName())) { elements.add(index, responseEle); break; } }

 

转载于:https://www.cnblogs.com/Gyoung/p/5422416.html

你可能感兴趣的文章
BZOJ 1901 Zju2112 Dynamic Rankings 题解
查看>>
java线程死锁研究
查看>>
C++虚析构函数
查看>>
hdu2544---最短路
查看>>
[HAOI2006] 聪明的猴子
查看>>
百度地图的基本使用
查看>>
剪切图片
查看>>
利用PyCharm进行Python远程调试
查看>>
python之模块随笔记-os
查看>>
android:exported 属性详解
查看>>
m2e (maven eclipse) 在运行一些命令时出现了无法compile(Unable to locate the Javac Compiler in:)...
查看>>
Underscore骨骼
查看>>
前端发展史
查看>>
sql plus命令大全(2)
查看>>
10.TreeSet、比较器
查看>>
System V 共享内存区
查看>>
SD卡 TF卡 接口引脚定义
查看>>
STM32 逐次逼近寄存器型(SAR)模拟数字转换器(ADC)
查看>>
k8s认证及ServiceAccount-十五
查看>>
【数论】逆元详解
查看>>