java中操作xml的方法总结

一丶常用方法

  主要有3个方面, 1读取xml文件, 2使用xpath根据指定路径获取某一节点数据 3, xml和java bean的转换

  XmlUtils.java

/**
 * 和cn.hutool.core.util.XmlUtil许多功能重合, 本类可以当做学习的例子
 * 可以直接使用cn.hutool.core.util.XmlUtil
 *
 * @author TimFruit
 * @date 19-11-2 下午5:22
 */
public class XmlUtils {

    // --------------------------------------
    public static Document createXml(){
        return XmlUtil.createXml();
    }

    // --------------------------------------

    /**
     * 读取xml文档
     * @param xmlInputStream
     * @return
     */
    public static Document readXml(InputStream xmlInputStream){
        return readXml(xmlInputStream, false);
    }

    public static Document readXml(InputStream xmlInputStream, boolean validate){  // 参考mybatis parsing模块
        try {
            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
            factory.setValidating(validate);

            factory.setNamespaceAware(false);
            factory.setIgnoringComments(true);
            factory.setIgnoringElementContentWhitespace(false);
            factory.setCoalescing(false);
            factory.setExpandEntityReferences(true);

            DocumentBuilder builder=factory.newDocumentBuilder();
            return builder.parse(xmlInputStream);
        } catch (ParserConfigurationException e) {
            throw new RuntimeException(e);
        } catch (SAXException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static Document readXml(String xmlStr){
        return XmlUtil.parseXml(xmlStr); //使用hutool
    }

    // --------------------------------------

    // 根据路径获取某一节点

    public static XPath newXpath(){
        return XPathFactory.newInstance().newXPath();
    }

    /**
     * 根据路径获取某一节点, 语法看 https://www.w3school.com.cn/xpath/xpath_syntax.asp
     * @param expression
     * @param root  可以是document, 可以是Node等其他节点
     * @param xpath
     * @return 返回的节点可以修改
     */
    public static Node evalNode(String expression, Object root, XPath xpath){
        return (Node)evaluate(expression, root, XPathConstants.NODE, xpath);
    }

    public static NodeList evalNodeList(String expression, Object root, XPath xpath){
        return (NodeList)evaluate(expression, root, XPathConstants.NODESET, xpath);
    }

    public static Double evalDouble(String expression, Object root, XPath xpath) {
        return (Double) evaluate(expression, root, XPathConstants.NUMBER, xpath);
    }

    public static Boolean evalBoolean(String expression, Object root, XPath xpath) {
        return (Boolean) evaluate(expression, root, XPathConstants.BOOLEAN, xpath);
    }

    public static String evalString(String expression, Object root, XPath xpath) {
        return (String) evaluate(expression, root, XPathConstants.STRING, xpath);
    }

    public static Long evalLong(String expression, Object root, XPath xpath){
        return Long.valueOf(evalString(expression, root, xpath));
    }

    public static Integer evalInteger(String expression, Object root, XPath xpath){
        return Integer.valueOf(evalString(expression, root, xpath));
    }

    public static Float evalFloat(String expression, Object root, XPath xpath){
        return Float.valueOf(evalString(expression, root, xpath));
    }

    public static Short evalShort(String expression, Object root, XPath xpath){
        return Short.valueOf(evalString(expression, root, xpath));
    }

    private static Object evaluate(String expression, Object root, QName returnType, XPath xpath) {
        try {
            return xpath.evaluate(expression, root, returnType);
        } catch (Exception e) {
            throw new RuntimeException("Error evaluating XPath.  Cause: " + e, e);
        }
    }

    // --------------------------------------
    // 转成string

    public static String toStr(Node node){
        return toStr(node, false);
    }

    public static String toStr(Node node, boolean isPretty){
        return toStr(node, "utf-8", isPretty);
    }

    /**
     *
     * @param node
     * @param charset 编码
     * @param isPretty 是否格式化输出
     * @return
     */
    public static String toStr(Node node, String charset, boolean isPretty){
        final StringWriter writer = StrUtil.getWriter();
        final int INDENT_DEFAULT=2;
        try {
            XmlUtil.transform(new DOMSource(node), new StreamResult(writer), charset, isPretty ? INDENT_DEFAULT : 0);
        } catch (Exception e) {
            throw new UtilException(e, "Trans xml document to string error!");
        }
        return writer.toString();
    }

    //----------------------------------------
    // 和java bean转换

    public static JSONObject toJSONObject(String xmlStr){
        return XML.toJSONObject(xmlStr);
    }

    public static JSONObject toJSONObject(Node node){
        String xmlStr=toStr(node);
        return toJSONObject(xmlStr);
    }

    public static <T> T toBean(Node node, Class<T> clazz){
        return toJSONObject(node).toBean(clazz);
    }

    public static Node toNode(Object obj){
        String xml=toXml(obj);
        Node rootNode=readXml(xml).getFirstChild();
        return rootNode;
    }

    public static String toXml(Object obj){
        return XML.toXml(obj);
    }

}

二丶测试

 @Test
    public void readXmlFromInputStreamTest(){
        BufferedInputStream bis=FileUtil.getInputStream("xml/bookstore.xml");

        Document document=XmlUtils.readXml(bis);

        String nodeName=document.getFirstChild().getNodeName();
        System.out.println(nodeName);
        Assert.assertTrue(nodeName.equals("bookstore"));

    }

    @Test
    public void readXmlStringTest() throws IOException {
        BufferedInputStream bis=FileUtil.getInputStream("xml/bookstore.xml");
        String xmlStr=StreamUtils.copyToString(bis, Charset.defaultCharset());
        Document document=XmlUtils.readXml(xmlStr);

        String nodeName=document.getFirstChild().getNodeName();
        System.out.println(nodeName);
        Assert.assertTrue(nodeName.equals("bookstore"));

    }

    // -------------------------------------------- xpath

    /*
    https://www.w3school.com.cn/xpath/xpath_syntax.asp

    nodename     选取此节点的所有子节点。
    /     从根节点选取。
    //     从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
    .     选取当前节点。
    ..     选取当前节点的父节点。
    @     选取属性。
     */
    @Test
    public void evalNodeTest(){
        BufferedInputStream bis=FileUtil.getInputStream("xml/bookstore.xml");
        Document document=XmlUtils.readXml(bis);
        XPath xpath=XmlUtils.newXpath();

        // 1. 使用xpath表达式读取根节点
        Node rootNode=XmlUtils.evalNode("/bookstore", document, xpath);
        Assert.assertEquals("bookstore", rootNode.getNodeName());

        // 2. 使用xpath表达式读取nodeList
        NodeList bookNodeList =XmlUtils.evalNodeList("/bookstore/book", document, xpath);
        Node bookNode=null;
        for(int i=0; i<bookNodeList.getLength(); i++){
            bookNode=bookNodeList.item(i);
            Assert.assertEquals("book", bookNode.getNodeName());
        }

        // 3. 使用xpath表达式从节点读取nodeList
        bookNodeList=XmlUtils.evalNodeList("/book", rootNode, xpath);
        for(int i=0; i<bookNodeList.getLength(); i++){
            bookNode=bookNodeList.item(i);
            Assert.assertEquals("book", bookNode.getNodeName());
        }

        // 4. 使用xpath表达式读取属性 数组表达式从1开始, /@ 修饰获取属性
        String lang=XmlUtils.evalString("/bookstore/book[1]/title/@lang", document, xpath);
        Assert.assertEquals("en", lang);

        lang=XmlUtils.evalString("/bookstore/book[2]/title/@lang", document, xpath);
        Assert.assertEquals("cn", lang);
    }

    // --------------------------------- 转换

    @Test
    public void xmlToJSONObjectTest() throws IOException {
        BufferedInputStream bis=FileUtil.getInputStream("xml/bookstore.xml");
        String xmlStr=StreamUtils.copyToString(bis, Charset.forName("utf-8"));

        JSONObject jso=XmlUtils.toJSONObject(xmlStr);

        Assert.assertTrue(jso.getJSONObject("bookstore")!=null);

        Assert.assertTrue(jso.getJSONObject("bookstore").getJSONArray("book")!=null);
    }

    @Test
    public void nodeToJSONObjectTest(){
        BufferedInputStream bis=FileUtil.getInputStream("xml/bookstore.xml");
        Document document=XmlUtils.readXml(bis);

        JSONObject jso=XmlUtils.toJSONObject(document);

        Assert.assertTrue(jso.getJSONObject("bookstore")!=null);

        Assert.assertTrue(jso.getJSONObject("bookstore").getJSONArray("book")!=null);
    }

    @Test
    public void toBeanTest(){
        BufferedInputStream bis=FileUtil.getInputStream("xml/bookstore.xml");
        Document document=XmlUtils.readXml(bis);

        XmlBookstoreDto dto=XmlUtils.toBean(document, XmlBookstoreDto.class);

        Bookstore bookstore=dto.getBookstore();
        Assert.assertNotNull(bookstore);

        List<Book> bookList=bookstore.getBook();

        Book book1=bookList.get(0);
        Assert.assertTrue(book1.getTitle().getLang().equals("en"));
        Assert.assertTrue(book1.getTitle().getContent().equals("Harry Potter"));
        Assert.assertTrue(book1.getAuthor().equals("J K. Rowling"));

        Book book2=bookList.get(1);
        Assert.assertTrue(book2.getTitle().getLang().equals("cn"));
        Assert.assertTrue(book2.getTitle().getContent().equals("where I am from"));
        Assert.assertTrue(book2.getAuthor().equals("timfruit"));

    }

  完整源码

原文地址:https://www.cnblogs.com/timfruit/p/11789699.html

时间: 2024-10-12 15:05:37

java中操作xml的方法总结的相关文章

java中调用xml的方法:DocumentBuilderFactory

具体的使用方法如下: (1)得到 DOM 解析器的工厂实例 DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance(); (2)从 DOM 工厂获得 DOM 解析器 DocumentBuilder dombuilder=domfac.newDocumentBuilder(); (3 )把要解析的 XML 文档转化为输入流,以便 DOM 解析器解析它 InputStream is= new  FileInputStream(

Flex中操作XML的E4X方法

用于处理 XML 的 E4X 方法 Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本 ECMAScript for XML 规范定义了一组用于使用 XML 数据的类和功能.这些类和功能统称为 E4X.ActionScript 3.0 包含以下 E4X 类:XML.XMLList.QName 和 Namespace. E4X 类的方法.属性和运算符旨在实现以下目标: 简单 - 在可能的情况下,使用 E4X 可以更容易地编写和理解用于使用 XML 数据的代码. 一致

Java中对xml的解析

Java中对xml的解析 1.Dom4j Dom解析原理:xml解析器一次性将xml文档加载到内存中,然后在内存中构建一颗Document对象树.在通过Document对象得到树上的节点对象,通过节点对象操作文档内容. Dom4J 常用的对象: SAXReader:读取 xml 文件到 Document 树结构文件对象 Document:是一个 xml 文档对象树,类比 Html 文档对象. Element:元素节点.通过 Document 对象可以查找单个元素 使用步骤: ( 导入 Dom4J

详细介绍Flex中操作XML

一  在介绍Flex中操作XML之前,首先简单介绍下XML中的基本术语. 元素:XML中拥有开始标签和结束标签的这一块称为“元素”    节点:把XML元素与文本结合起来统称为节点    根节点:位于整个XML文当顶端的节点    文本节点:包含文本的节点    属性:元素的组成部分,以键/值形式放在元素标签内 用一个例子来说明 <root_node><!--这是一个根节点也是一个元素--> <node attribute="value"><!

C#.Net中操作XML方法一

我们知道XML是一种可标记性的语言,用来标记数据.定义数据类型,是一种执行用户对自己的标记语言进行定义的源语言.由于结构好.而且easy理解,就好比一棵树,层次关系分明,因此也经常把一些数据存储到XML文件里,以下就说一下怎样在C#中操作XML文件. 经常使用类 XmlDocument:XML的文档.就好比一棵树. XmlNode:XML中的结点类,就好比树枝. XmlElement:XML中元素,就好比树枝上的叶子. 既然我们已经了解这几个经常使用类的,那么让你画一棵树是不是非常easy呢?

Java中vector的使用方法

Vector的使用 vector类底层数组结构的,它包含可以使用整数索引进行访问的组件.不过,vector的大小可以根据需要增大或缩小,以适应创建vector后进行添加或移除项的操作,因此不需要考虑元素是否越界或者会不会浪费内存的问题. 由vector的iterator和listIterator方法所返回的迭代器是快速失败的:也即是它不能并发执行操作.如果在迭代器创建后的任意时间从结构上修改了向量(通过迭代器自身的remove或add方法之外的任何其他方式),则迭代器将抛出ConcurrentM

java中的jdbc连接数据库方法及应用

jdbc连接数据库的口诀:猪脸特直观 import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Demo03 { public static void main(String[] args) thr

使用jcabi-ssh在java中操作ssh命令

使用jcabi-ssh在java中操作ssh命令 如果我们想在java代码中远程连接ssh,并且执行一些shell命令,可以使用jcabi-ssh这个小框架,纯java编写,很方便.这里介绍一下如何使用. 依赖 java框架,依赖的包肯定是jar文件了,jar包地址http://repo1.maven.org/maven2/com/jcabi/jcabi-ssh/1.1/jcabi-ssh-1.1.jar,如果使用maven管理,可以添加依赖: <dependency> <groupId

VC++中操作XML(MFC、SDK)转

[转]VC++中操作XML(MFC.SDK) XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++里操作XML有两个库可以用:MSXML和XmlLite.MSXML又细分了两种接口:DOM和SAX2.XP没自带有XmlLite,只自带有2.x.3.x版的MSXML,不支持SAX2(需要MSXML 4.0以上),所以优先使用DOM.DOM是以COM形式提供的,VC++里调用DOM可以分3种方法:1