dom4j使用总结
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; } }
如果我的文章对你有帮助,就点一下推荐吧.(*^__^*)