java操作xml的方法匯總及解析
這篇文章主要介紹了java操作xml的方法匯總及解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
一丶常用方法
主要有3個方面, 1讀取xml文件, 2使用xpath根據(jù)指定路徑獲取某一節(jié)點數(shù)據(jù) 3, xml和java bean的轉(zhuǎn)換
XmlUtils.java
/**
* 和cn.hutool.core.util.XmlUtil許多功能重合, 本類可以當(dāng)做學(xué)習(xí)的例子
* 可以直接使用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
}
// --------------------------------------
// 根據(jù)路徑獲取某一節(jié)點
public static XPath newXpath(){
return XPathFactory.newInstance().newXPath();
}
/**
* 根據(jù)路徑獲取某一節(jié)點, 語法看 https://www.w3school.com.cn/xpath/xpath_syntax.asp
* @param expression
* @param root 可以是document, 可以是Node等其他節(jié)點
* @param xpath
* @return 返回的節(jié)點可以修改
*/
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);
}
}
// --------------------------------------
// 轉(zhuǎn)成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轉(zhuǎn)換
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 選取此節(jié)點的所有子節(jié)點。
/ 從根節(jié)點選取。
// 從匹配選擇的當(dāng)前節(jié)點選擇文檔中的節(jié)點,而不考慮它們的位置。
. 選取當(dāng)前節(jié)點。
.. 選取當(dāng)前節(jié)點的父節(jié)點。
@ 選取屬性。
*/
@Test
public void evalNodeTest(){
BufferedInputStream bis=FileUtil.getInputStream("xml/bookstore.xml");
Document document=XmlUtils.readXml(bis);
XPath xpath=XmlUtils.newXpath();
// 1. 使用xpath表達(dá)式讀取根節(jié)點
Node rootNode=XmlUtils.evalNode("/bookstore", document, xpath);
Assert.assertEquals("bookstore", rootNode.getNodeName());
// 2. 使用xpath表達(dá)式讀取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表達(dá)式從節(jié)點讀取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表達(dá)式讀取屬性 數(shù)組表達(dá)式從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);
}
// --------------------------------- 轉(zhuǎn)換
@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"));
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java實戰(zhàn)權(quán)限管理系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SpringBoot+MyBatis+AOP+LayUI+Mysql實現(xiàn)一個權(quán)限管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2022-01-01
Java 實戰(zhàn)項目錘煉之嘟嘟健身房管理系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實現(xiàn)一個健身房管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11
java.io.UncheckedIOException: Cannot delete C
本文主要介紹了java.io.UncheckedIOException: Cannot delete C:\Users\guo\AppData\Local\Temp\tomcat.8081問題,具有一定的參考價值,感興趣的可以了解一下2024-05-05
解決IDEA中Maven依賴包導(dǎo)入失敗報紅問題(總結(jié)最有效8種解決方案)
這篇文章主要介紹了解決IDEA中Maven依賴包導(dǎo)入失敗報紅問題,本文通過圖文詳解給大家總結(jié)了最有效的8種解決方法,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
你知道怎么從Python角度學(xué)習(xí)Java基礎(chǔ)
這篇文章主要為大家詳細(xì)介紹了Python角度學(xué)習(xí)Java基礎(chǔ)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02
如何使用?Spring?Boot?搭建?WebSocket?服務(wù)器實現(xiàn)多客戶端連接
本文介紹如何使用SpringBoot快速搭建WebSocket服務(wù)器,實現(xiàn)多客戶端連接和消息廣播,WebSocket協(xié)議提供全雙工通信,SpringBoot通過@ServerEndpoint簡化配置,支持實時消息推送,適用于聊天室或通知系統(tǒng)等應(yīng)用場景2024-11-11

