java操作xml的方法汇总及解析

这篇文章主要介绍了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"));

  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现XML增加元素操作简单示例

    本文实例讲述了java实现XML增加元素操作.分享给大家供大家参考,具体如下: package Day01; import java.io.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.*; public

  • java使用jaxb操作xml示例

    首先定义两个示例类ClassA,ClassB,用于后续的示例演示 复制代码 代码如下: package cn.lzrabbit; public class ClassA {     private int classAId;     private String classAName; private ClassB classB; public int getClassAId() {         return classAId;     } public void setClassAId(i

  • Java操作XML工具类XmlUtil详解

    本文实例为大家分享了Java操作XML工具类的具体代码,供大家参考,具体内容如下 一.代码 public class XmlUtil { /** * 将XML文件输出到指定的路径 * * @param doc * @param fileName * @throws Exception */ public static void outputXml(Document doc, String fileName) throws Exception { TransformerFactory tf = T

  • java对XML文件的解析、节点的增加、删除操作总结

    1.java代码: 主要采用dom来进行操作 复制代码 代码如下: package test; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.T

  • Java对XML文件增删改查操作示例

    本文实例讲述了Java对XML文件增删改查操作.分享给大家供大家参考,具体如下: xml文件: <?xml version="1.0" encoding="UTF-8"?> <books> <book> <name>哈里波特</name> <price>10</price> <memo>这是一本很好看的书.</memo> </book> <b

  • java使用DOM4J对XML文件进行增删改查操作

    本文实例为大家分享了java使用DOM4J对XML文件进行增删改查操作的具体代码,供大家参考,具体内容如下 源代码: DOM4j.java package com.zc.homeWork19; import java.io.FileWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.Elem

  • java操作(DOM、SAX、JDOM、DOM4J)xml方式的四种比较与详解

    1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以在任何时候在树中上下导航,而不是像SAX那

  • java中四种操作xml方式的比较

    1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以在任何时候在树中上下导航,而不是像SAX那

  • java操作xml的方法汇总及解析

    这篇文章主要介绍了java操作xml的方法汇总及解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一丶常用方法 主要有3个方面, 1读取xml文件, 2使用xpath根据指定路径获取某一节点数据 3, xml和java bean的转换 XmlUtils.java /** * 和cn.hutool.core.util.XmlUtil许多功能重合, 本类可以当做学习的例子 * 可以直接使用cn.hutool.core.util.XmlUtil *

  • C#操作XML通用方法汇总

    在.net的项目开发中,经常会对XML文件进行操作,由于XML文件可以实现跨平台传输,较多的应用在数据传输中,特总结以下几种常用的XML操作方法: 1.创建XML文档: /// <summary> /// 创建XML文档 /// </summary> /// <param name="name">根节点名称</param> /// <param name="type">根节点的一个属性值</param

  • JAVA操作XML实例分析

    本文实例讲述了JAVA操作XML的方法.分享给大家供大家参考.具体如下: java代码如下: 复制代码 代码如下: import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import org.w3c.dom.*; import org.xml.sax.SAXException; import javax.xml.

  • java中xml进行报文发送和解析操作

    利用OKhttp网络框架,进行Maven项目管理 //报文发送 <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.8.0</version> </dependency> //报文解析 <dependency> <groupId>xom</gr

  • PHP基于XMLWriter操作xml的方法分析

    本文实例讲述了PHP基于XMLWriter操作xml的方法.分享给大家供大家参考,具体如下: 接着昨天的这次再来学习一种读写xml的方式,这种方式主要围绕XMLWriter和XMLReader进行.前者用于生成xml,后者则是用来读取并解析xml.废话不多说一起来看看吧 1. 生成xml文件或字符串 <?php header("Content-type: text/html; charset=utf-8"); $xml=new XMLWriter(); //$xml->op

  • java生成XML的方法【附demo源码下载】

    本文实例讲述了java生成XML的方法.分享给大家供大家参考,具体如下: 下拉框的生成,我是通过javascript读取xml文件生成的.Xml文件是根据数据库生成的.Xml文件只相当于页面到数据库的一道缓存.这样利于性能.生成xml文件又是一件繁琐的事情.只好交给机器去做了.真正的情景是程序定期自动或人为手动触发程序生成xml.今天我单独把xml文件生成的功能剥离出来写了一个小程序. 具体的实现是,使用jxl.jar读取(我承认我很喜欢使用Execel写配置)的SQL语句.SQL要指明哪些是名

  • JAVA字符串拼接常见方法汇总

    字符串的拼接,常使用到的大概有4种方式: 1.直接使用"+"号 2.使用String的concat方法 3.使用StringBuilder的append方法 4.使用StringBuffer的append方法 由于String是final类型的,因此String对象都是属于不可变对象,因此,在需要对字符串进行修改操作的时候(比如字符串的连接或者是替换),String总是会生成新的对象. 1."+" 如果不考虑其他,使用"+"号来连接字符串无疑是最

  • java操作excel的方法

    本文实例讲述了java操作excel的方法.分享给大家供大家参考.具体如下: WritableWorkbook workbook = Workbook.createWorkbook(new File("d:\\output.xls")); WritableSheet sheet = workbook.createSheet("项目简报", 0); //样式 WritableFont sonti18font = new WritableFont(WritableFon

  • Java操作Mysql的方法

    本文实例讲述了Java操作Mysql的方法.分享给大家供大家参考.具体分析如下: 不同于C#操纵数据库的千篇一律,如果是要Java把操纵数据库的语句分为两种: 一种是有结果的select语句,还有一种是没结果的insert into,update,delete等语句 1.如果是有结果的select语句,则需要定义一个ResultSet变量来接,同时使用con.prepareStatement(sql).executeQuery();来查询,其中con是一个数据库连接变量,在程序头必须引入java

随机推荐