xml 属性value换行显示_跟光磊学Java开发-Java解析XML
XML介紹
XML(EXtensible Markup Language)指的是可擴展的標記語言。
XML經常被用于框架的配置文件,例如Mybatis,Spring等開源框架都會使用XML作為配置文件。
XML標簽沒有被預先定義 ,通常需要開發人員自定義標簽,標簽區分大小寫。
XML是W3C的推薦標準,W3C在1988年2月發布了XML1.0版本,2004年2月又發布了XML 1.1版本,但是XML 1.1版本不能向下兼容XML 1.0版本,所以XML 1.1版本沒有人使用。同時在2004年2月W3C又發布了XML 1.0版本的第三個版本。因此目前都使用XML1.0
XML元素組成
一個標準的XML文件由文檔聲明、元素標簽、屬性、注釋、轉義字符和字符區域組成
- 文檔聲明
文檔聲明用于描述xml的版本和編碼,文檔聲明必須在XML文件的第一行,以開頭,以?>結尾
文檔聲明有兩個屬性,其中version=1.0表示XML的版本為1.0,而encoding=UTF-8 表示XML文件采用UTF-8編碼
- 元素
元素又叫標簽,是XML最重要的組成部分,XML文件中必須要有一個根標簽(也就是最外層的標簽),標簽由開始標簽和結束標簽組成,例如標簽,其中 表示開始標簽,而表示結束標簽。
開始標簽和結束標簽之間的內容可以寫文本內容,也可以嵌套其他標簽,但是切勿隨意嵌套。
如果標簽中沒有內容,那么可以定義空標簽,例如
XML的標簽在命名時需要注意 ,不要使用xml,XML或者Xml,不能使用空格、冒號,命名區分大小寫、數字不能開頭。
<?xml version="1.0" encoding="UTF-8" ?>tony 28- 屬性
屬性是元素的一部分,它必須定義在開始標簽中,不能定義在結束標簽中。
屬性定義的格式為屬性名 = 屬性值 ,其中屬性值必須使用單引號或者雙引號括起來,一個元素可以有0-N個屬性,但是一個元素中不能出現同名的屬性。
空標簽也可以定義屬性。
屬性名不能使用空格,不能使用冒號等特殊字符,且必須以字母開頭。
- 注釋
XML的注釋使用結束,即使用表示注釋,在注釋時不能嵌套使用。
Windows下IDEA中可以使用Ctrl+/生成注釋,macOS下使用Command+/生成注釋
- 轉義字符
有些特殊的字符在XML中是不會被識別,例如>,
所以在標簽或者屬性值中想要使用這些字符就需要使用轉義字符。 - < 表示小于(>)
- > 表示大于(>)
- & 表示與(&)
- ' 表示單引號號(')
- " 表示雙引號(")
不過嚴格意義上只有<和&是不會別被識別的,其他都可以識別
使用轉義字符解決不能識別的特殊字符
loginCount >=0 && loginCount<= 3使用瀏覽器打開user.xml文件
會看到特殊字符已經被轉義字符處理,能夠整正常解析
- 字符區
字符區使用CDATA表示,CDATA內部的所有內容都會被解析器忽略,當做文本處理。
如果你記不住XML的轉義字符,就可以使用CDATA
CDATA的格式
使用CDATA替代XML轉義字符
<?xml version="1.0" encoding="UTF-8" ?>00001tony 28 =0 && logoutCount<=3 ]]>刷新剛才打開的瀏覽器,查看CDATA區的特殊字符能正常顯示。
XML約束
XML約束概述
XML約束給編寫XML文檔和解析XML文檔的人共同的規范
XML約束用于約束XML文檔的書寫規范,即限制XML文檔中允許出現的元素名稱、順序和屬性。
XML約束主要有DTD約束(文件后綴名為.dtd)和Schema約束(文件后綴名為xsd)兩種方式。
DTD約束
關于DTD約束需要了解文檔聲明、元素聲明和屬性聲明,通常開發過程中開發人員只需要讀懂DTD聲明,根據該聲明編寫符合DTD規范的XML文件即可。
- 文檔聲明
DTD約束文檔可以聲明在3個不同的地方
內部聲明DTD的語法格式
<?xml version="1.0" encoding="UTF-8" ?>元素聲明] >user.xml文件內部聲明DTD
<?xml version="1.0" encoding="UTF-8" ?> ]>00001tony 28 =0 && logoutCount<=3 ]]>定義 users.dtd
<?xml version="1.0" encoding="UTF-8" ?>然后在users.xml文件中引用本地磁盤路徑下的users.dtd
當XML文件中引入dtd后編寫XML時會有標簽、屬性提示
如果不符合DTD規范會報錯,根據DTD文件編寫的XML
外部DTD-公共DTD 引用格式
稱" "DTD文檔的url" >例如
- 元素聲明
DTD元素聲明用于約束元素的嵌套層級、數據類型以及元素個數
聲明根標簽是users標簽,根標簽下有多個user標簽,同時每個user標簽下有固定順序的(id,name,age,address,password,loginCount,registerResource,international)8個子標簽
標簽類型的取值可以是 PCDATA,ANY,其中PCDATA表示文本類型,而ANY表示任意類型,例如子標簽
約束id,name,age,address,password,loginCount,registerResource,international 標簽只能包含文本,不能包含子標簽
- * 表示元素可以出現0個到多個
- + 表示元素至少出現一個
約束users根標簽必須包含1個user標簽
- ? 表示元素可以是0個或者1個
- , 表示元素要按照順序顯示
- | 表示元素需要選取其中的某一個
- 屬性聲明
其中屬性類型有
- CDATA 表示屬性值為文本字符串
- ID 表示屬性值唯一,不能以數字開頭
屬性說明
- REQUIRED 表示該屬性必須出現
- IMPLIED 表示該屬性可有可無
- ENUMERATED(DTD沒有此關鍵字),表示枚舉,只能從枚舉中選其一
- FIXED 表示屬性值是一個固定值
約束user標簽必須包含id屬性,并且屬性值是ID類型
約束registerResource標簽value屬性的取值是WEB,Android,iOS,WeChat,H5的其中一個。標簽的取值范圍是一個枚舉
約束password標簽的default屬性可有可無
約束international標簽的固定值是China
Schema約束
Schema和DTD一樣,也是一種XML約束,該約束的后綴文件為.xsd,即XML Schema Definition,相比DTD而言Schema約束功能更為強大,數據類型約束更為完善。
<?xml version="1.0" encoding="utf-8" ?>根據XSD文件編寫XML
<?xml version="1.0" encoding="UTF-8" ?> 2021-01-03T10:32:00.285106XML解析
XML解析概述
日常開發中常用的XML解析方式有兩種
DOM解析會將整個XML文檔加載到內存,并解析成一個XML對象,其優點是元素和元素之間保留結構關系,可以對其進行增刪改查操作 ,但是缺點是如果XML文件過大,可能會造成內存溢出。
SAX是一種速度更快,更有效的方法,它是逐行掃描文檔,一邊掃描一邊解析。并且以事件驅動的方式進行解析,每執行一行都會觸發一個事件。SAX解析的優點是不會出現內存問題,可以處理大文件,但是缺點是只能讀,不能回寫。即不能進行增刪改查操作。
不管什么方式都需要實現解析器,即根據不同的解析方式實現解析器。
日常開發常用的是基于DOM方式實現的解析器實現:Dom4j和JDom
Dom4j 解析XML
Dom4j解析XML時會將整個XML文件加載到內存,生成一個DOM樹,并獲得一個Document對象,通過Document對象就可以對DOM進行操作。
在使用Dom4j之前需要將Dom4j的maven依賴添加到項目中
org.dom4j dom4j 2.1.3這里使用的是Dom4j 2.1.3版本
然后準備一個xml文件,該文件名是user.xml,位于src/main/resources目錄下
<?xml version="1.0" encoding="UTF-8" ?>ittimeline0001tony 28 上海市 6666660Web網站中國ittimeline00002tom 28 北京市 0安卓國籍使用Dom4j解析XML文件的步驟
程序運行結果
Dom4j集成XPath解析XML
XPath使用路徑表達式來獲取HTMLXML文檔中的元素節點或者屬性節點,節點是通過沿著路徑(path)獲取。
XPath在解析HTMLXML文檔方面樹立了獨樹一幟的路徑思想。
在使用Xpath之前需要將XPath的Maven依賴添加到項目中
jaxen jaxen 1.2.0然后通過Document對象的兩個方法傳遞XPath路徑來查找指定的元素
- Node selectSingleNode(String xpathExpression);通過xPath表達式查詢單個元素
- List selectNodes(String xpathExpression); 通過xPath表達式查詢多個元素
XPath提供了四種路徑方式查找元素
* 四種 xpath路徑 * 1. 絕對路徑表達式方式 例如/元素/子元素/子子元素 絕對路徑需要從根路徑開始 * 2. 相對路徑表達方式 例如子元素/子子元素 相對路徑是以當前節點元素位置繼續查找,不以/開頭,../表示上一個元素,./表示當前元素 * 3. 全文搜索路徑表達方式 例如//子元素/子子元素 不管中間有多少層,直接獲取所有子元素中滿足條件的元素 * 4. 謂語(條件篩選方式) 例如 //元素[@attribute='value'] */ @Test public void testDom4jXPathAbsoluteParseUsersXML() { try { //創建解析器對象 SAXReader saxReader = new SAXReader(); //得到Document對象 Document document = saxReader.read(Dom4jTest.class.getClassLoader().getResourceAsStream("users.xml")); //通過絕對路徑的方式獲取單個name元素 Element nameElement = (Element) document.selectSingleNode("/users/user/name"); log.info("通過絕對路徑方式獲取單個name元素的文本{}", nameElement.getText()); //通過絕對路徑的方式獲取所有name元素的文本 List nameElements = document.selectNodes("/users/user/name"); nameElements.forEach(singleNameElement -> { log.info("通過絕對路徑的方式獲取所有name元素的文本 {}", singleNameElement.getText()); }); } catch (DocumentException e) { e.printStackTrace(); } }
程序運行結果
* 四種 xpath路徑 * 1. 絕對路徑表達式方式 例如/元素/子元素/子子元素 絕對路徑需要從根路徑開始 * 2. 相對路徑表達方式 例如子元素/子子元素 相對路徑是以當前節點元素位置繼續查找,不以/開頭,../表示上一個元素,./表示當前元素 * 3. 全文搜索路徑表達方式 例如//子元素/子子元素 不管中間有多少層,直接獲取所有子元素中滿足條件的元素 * 4. 謂語(條件篩選方式) 例如 //元素[@attribute='value'] */ @Test public void testDom4jXPathRelativeParseUsersXML() { try { //創建解析器對象 SAXReader saxReader = new SAXReader(); //得到Document對象 Document document = saxReader.read(Dom4jTest.class.getClassLoader().getResourceAsStream("users.xml")); //當前表示user節點 Element userElement = (Element) document.selectSingleNode("/users/user"); //通過相對路徑的方式根據user節點獲取單個registerResourceElement節點元素的文本 Element registerResourceElement = (Element) userElement.selectSingleNode("./registerResource"); log.info("通過相對路徑的方式根據user節點獲取單個registerResourceElement節點元素的文本 {}", registerResourceElement.getText()); //通過相對路徑的方式獲取單個user節點id的屬性值 Element upUserElement = (Element) registerResourceElement.selectSingleNode("../../user"); String userId = upUserElement.attributeValue("id"); log.info("通過相對路徑的方式獲取單個user節點id的屬性值 {}", userId); } catch (DocumentException e) { e.printStackTrace(); } }
程序運行結果
* 四種 xpath路徑 * 1. 絕對路徑表達式方式 例如/元素/子元素/子子元素 絕對路徑需要從根路徑開始 * 2. 相對路徑表達方式 例如子元素/子子元素 相對路徑是以當前節點元素位置繼續查找,不以/開頭,../表示上一個元素,./表示當前元素 * 3. 全文搜索路徑表達方式 例如//子元素/子子元素 不管中間有多少層,直接獲取所有子元素中滿足條件的元素 * 4. 謂語(條件篩選方式) 例如 //元素[@attribute='value'] */ @Test public void testDom4jXPathFullTextSearchParseUsersXML() { try { //創建解析器對象 SAXReader saxReader = new SAXReader(); //得到Document對象 Document document = saxReader.read(Dom4jTest.class.getClassLoader().getResourceAsStream("users.xml")); //使用全文搜索的方式獲取所有的registerResource List registerResourceNodeList = document.selectNodes("//user/registerResource"); registerResourceNodeList.forEach(registerResourceNode -> { log.info("使用全文搜索的方式獲取所有的registerResource{}", registerResourceNode.getText()); }); } catch (DocumentException e) { e.printStackTrace(); } }
程序運行結果
* 四種 xpath路徑 * 1. 絕對路徑表達式方式 例如/元素/子元素/子子元素 絕對路徑需要從根路徑開始 * 2. 相對路徑表達方式 例如子元素/子子元素 相對路徑是以當前節點元素位置繼續查找,不以/開頭,../表示上一個元素,./表示當前元素 * 3. 全文搜索路徑表達方式 例如//子元素/子子元素 * 4. 謂語(條件篩選方式) 例如 //元素[@attribute='value'] */ @Test public void testConditionSearch() { try { //創建解析器對象 SAXReader saxReader = new SAXReader(); //得到Document對象 Document document = saxReader.read(Dom4jTest.class.getClassLoader().getResourceAsStream("users.xml")); //使用條件搜索id為ittimeline0002的user元素 Element element = (Element) document.selectSingleNode("//user[@id='ittimeline0002']"); log.info("使用條件搜索id為ittimeline0002的user元素的id屬性值是 {}", element.attributeValue("id")); } catch (DocumentException e) { e.printStackTrace(); } }
程序運行結果
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的xml 属性value换行显示_跟光磊学Java开发-Java解析XML的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 电力系统分析 毕设,基于M
- 下一篇: 设计模式学习笔记--解释器模式