zoukankan      html  css  js  c++  java
  • 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 + "检验失败。
    原因: " + 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;
                        }
                    }
  • 相关阅读:
    POJ
    POJ
    HDU
    HDU
    HDU
    POJ
    HDU
    POJ
    A-meeting 2019牛客暑期多校第四场 (树的直径)
    算法与数据结构实验题 2.1 塔防
  • 原文地址:https://www.cnblogs.com/Gyoung/p/5422416.html
Copyright © 2011-2022 走看看