您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何在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")); }
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,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。