1. 程式人生 > 程式設計 >java操作xml的方法彙總及解析

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,XPath xpath){
    return (NodeList)evaluate(expression,XPathConstants.NODESET,xpath);
  }
  public static Double evalDouble(String expression,XPath xpath) {
    return (Double) evaluate(expression,XPathConstants.NUMBER,xpath);
  }
  public static Boolean evalBoolean(String expression,XPath xpath) {
    return (Boolean) evaluate(expression,XPathConstants.BOOLEAN,xpath);
  }
  public static String evalString(String expression,XPath xpath) {
    return (String) evaluate(expression,XPathConstants.STRING,xpath);
  }
  public static Long evalLong(String expression,XPath xpath){
    return Long.valueOf(evalString(expression,xpath));
  }
  public static Integer evalInteger(String expression,XPath xpath){
    return Integer.valueOf(evalString(expression,xpath));
  }
  public static Float evalFloat(String expression,XPath xpath){
    return Float.valueOf(evalString(expression,xpath));
  }
  public static Short evalShort(String expression,XPath xpath){
    return Short.valueOf(evalString(expression,xpath));
  }
  private static Object evaluate(String expression,QName returnType,XPath xpath) {
    try {
      return xpath.evaluate(expression,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",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",xpath);
    Assert.assertEquals("en",lang);

    lang=XmlUtils.evalString("/bookstore/book[2]/title/@lang",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"));

  }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。