温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何在java中操作xml

发布时间:2021-05-21 16:28:37 来源:亿速云 阅读:300 作者:Leah 栏目:编程语言

本篇文章为大家展示了如何在java中操作xml,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

一丶常用方法

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

XmlUtils.java

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"));

  }

常用的java框架有哪些

1.SpringMVC,Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架。2.Shiro,Apache Shiro是Java的一个安全框架。3.Mybatis,MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。4.Dubbo,Dubbo是一个分布式服务框架。5.Maven,Maven是个项目管理和构建自动化工具。6.RabbitMQ,RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。7.Ehcache,EhCache 是一个纯Java的进程内缓存框架。

上述内容就是如何在java中操作xml,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI