日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

xml 属性value换行显示_跟光磊学Java开发-Java解析XML

發布時間:2025/3/17 asp.net 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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文件的第一行,以開頭,以?>結尾
<?xml version="1.0" encoding="UTF-8" ?>

文檔聲明有兩個屬性,其中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 version="1.0" encoding="UTF-8" ?>ittimeline00001tony 28
  • 注釋
    XML的注釋使用結束,即使用表示注釋,在注釋時不能嵌套使用。
    Windows下IDEA中可以使用Ctrl+/生成注釋,macOS下使用Command+/生成注釋
<?xml version="1.0" encoding="UTF-8" ?>00001tony 28
  • 轉義字符
    有些特殊的字符在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文件內部嵌套DTD,只會對當前XML有效
  • 內部聲明DTD的語法格式

    <?xml version="1.0" encoding="UTF-8" ?>元素聲明] >

    user.xml文件內部聲明DTD

    <?xml version="1.0" encoding="UTF-8" ?> ]>00001tony 28 =0 && logoutCount<=3 ]]>
  • 外部DTD-本地DTD,即DTD文件聲明在外部的文件,但是存儲在本地磁盤路徑下,通常都是公司內部項目使用
  • 定義 users.dtd

    <?xml version="1.0" encoding="UTF-8" ?>

    然后在users.xml文件中引用本地磁盤路徑下的users.dtd

    當XML文件中引入dtd后編寫XML時會有標簽、屬性提示


    如果不符合DTD規范會報錯,根據DTD文件編寫的XML

  • 外部DTD-公共DTD,即DTD文檔在網絡上,一般都是由框架提供,也是我們使用最多的
  • 外部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.285106

    XML解析

    XML解析概述

    日常開發中常用的XML解析方式有兩種

  • DOM
    DOM解析會將整個XML文檔加載到內存,并解析成一個XML對象,其優點是元素和元素之間保留結構關系,可以對其進行增刪改查操作 ,但是缺點是如果XML文件過大,可能會造成內存溢出。
  • SAX
    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文件的步驟

  • 獲取解析器 SAXReader對象
  • 通過SAXReader對象讀取XML文件并返回Document對象
  • 通過Document對象獲取根元素
  • 通過根元素獲取子元素 Element
  • 通過Element對象獲取屬性信息以及元素的文本信息
  • /** * 使用Dom4j解析users.xml * * @see SAXReader#read(InputStream) 從流中讀取XML文件獲取Document * @see Document#getRootElement() 獲取根元素 * @see Element#elementIterator() 迭代當前元素的子元素 * @see Element#attributeValue(String) 根據元素的屬性名稱獲取屬性值 */ @Test public void testDom4j2ParseUsersXML() { try { //創建解析器對象 SAXReader saxReader = new SAXReader(); //得到Document對象 Document document = saxReader.read(Dom4jTest.class.getClassLoader().getResourceAsStream("users.xml")); //獲取根元素 Element rootElement = document.getRootElement(); log.info("根元素信息{}", rootElement.getName()); Iterator userElementIterator = rootElement.elementIterator(); userElementIterator.forEachRemaining(userElement -> { log.info("獲取users節點下的子節點,節點名稱是{}", userElement.getName()); //獲取user標簽下的子標簽 Iterator userChildElements = userElement.elementIterator(); userChildElements.forEachRemaining(userChildElement -> { log.info("獲取user節點下的子節點,節點名稱是{}", userChildElement.getName()); if (userChildElement.getName().equals("password")) { String defaultPassword = userChildElement.attributeValue("default"); log.info("獲取password標簽的default屬性 {} ", defaultPassword); } //獲取user子標簽的標簽內容 log.info("獲取user子標簽的標簽內容{}", userChildElement.getText()); }); }); } catch (DocumentException e) { e.printStackTrace(); } }

    程序運行結果

    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提供了四種路徑方式查找元素

  • 絕對路徑表達式方式 例如/元素/子元素/子子元素 絕對路徑需要從根路徑開始
  • /** * Dom4j集成XPath解析XML * 使用Xpath的絕對路徑語法查找Xml * * @see Document#selectNodes(String) 參數是xpath路徑語法 * @see Document#selectSingleNode(String) 參數是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(); } }

    程序運行結果

  • 相對路徑表達方式 例如子元素/子子元素 相對路徑是以當前節點元素位置繼續查找,不以/開頭,../表示上一個元素,./表示當前元素
  • /** * Dom4j集成XPath解析XML * 使用Xpath的相對路徑語法查找Xml * * @see Document#selectNodes(String) 參數是xpath路徑語法 * @see Document#selectSingleNode(String) 參數是xpath路徑語法 *

    * 四種 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(); } }

    程序運行結果

  • 全文搜索路徑表達方式 例如//子元素/子子元素 不管中間有多少層,直接獲取所有子元素中滿足條件的元素
  • /** * Dom4j集成XPath解析XML * 使用Xpath的全文搜索語法查找Xml * * @see Document#selectNodes(String) 參數是xpath路徑語法 * @see Document#selectSingleNode(String) 參數是xpath路徑語法 *

    * 四種 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(); } }

    程序運行結果

  • 謂語(條件篩選方式) 例如 //元素[@attribute='value']
  • /** * Dom4j集成XPath解析XML * 使用Xpath的謂語(條件篩選方式)語法查找Xml * * @see Document#selectNodes(String) 參數是xpath路徑語法 * @see Document#selectSingleNode(String) 參數是xpath路徑語法 *

    * 四種 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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。