java操作xml的方法彙總及解析
阿新 • • 發佈:2020-01-07
這篇文章主要介紹了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")); }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。