文件解析出現問題,DOM方式解析XML文件實例

 2023-10-18 阅读 30 评论 0

摘要:books.XML文件: <?xml version="1.0" encoding="utf-8"?><bookstore>?? ?<book id="1">?? ??? ?<name>冰與火之歌</name>?? ??? ?<author>喬治馬丁</author>?? ??? ?<price>88.0

books.XML文件:

<?xml version="1.0" encoding="utf-8"?>
<bookstore>
?? ?<book id="1">
?? ??? ?<name>冰與火之歌</name>
?? ??? ?<author>喬治馬丁</author>
?? ??? ?<price>88.0</price>
?? ??? ?<year>2014</year>
?? ?</book>
?? ?<book id="2">
?? ??? ?<name>安徒生童話</name>
?? ??? ?<price>77.0</price>
?? ??? ?<language>English</language>
?? ?</book>
</bookstore>

把這個文檔放在項目的根路徑下,與src目錄平行,就可以使用相對路徑來引用了。

文件解析出現問題,?

Java代碼部分:

?

?public class DOMTest {
?? ?public static void main(String[] args) {

說出三種解析XML文檔的方式、?

   // step 1:獲得DOM解析器工廠

?

   // 工廠的作用是創建具體的解析器,即創建一個DocumentBuilderFactory對象
?? ??? ?
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
?? ??? ?try {
?? ??? ???? // step 2:獲得具體的dom解析器?? 創建一個DocumentBuilder對象
?? ??? ??? ?DocumentBuilder db=dbf.newDocumentBuilder();
?? ??? ??? ?// step 3:解析一個xml文檔,通過Document對象的parse方法加載books.xml文件到當前目錄下
?? ??? ??? ?Document document=db.parse("books.xml");
?? ??? ??? ?//獲取所有book節點的集合
?? ??? ??? ?NodeList booklist= document.getElementsByTagName("book");
?? ??? ??? ?//遍歷每一個book節點
?????????? //? 通過getLength()獲取NodeList的長度
?? ??? ??? ?for(int i=0;i<booklist.getLength();i++){
?? ??? ??? ??? ?System.out.println("下面開始遍歷第"+(i+1)+"本書");
?? ??? ??? ?//?? ?節點有多個屬性時:
?? ??? ??? ??? ?//通過item(i)獲取bookList的節點值,NodeList索引值從0開始
?? ??? ??? ??? ?Node book=booklist.item(i);
?? ??? ??? ??? ?//獲取book的所有屬性
?? ??? ??? ??? ?NamedNodeMap attrs= book.getAttributes();
?? ??? ??? ??? ?for(int j=0;j<attrs.getLength();j++){
?? ??? ??? ??? ??? ?//通過item(index)方法獲取book節點的某一個屬性
?? ??? ??? ??? ???
?Node attr=attrs.item(j);
?? ??? ??? ??? ??? ?//獲取屬性名
?? ??? ??? ??? ??? ?System.out.println("屬性名:"+attr.getNodeName());
?? ??? ??? ??? ??? ?//獲取屬性值
?? ??? ??? ??? ??? ?System.out.println("屬性值:"+attr.getNodeValue());
?? ??? ??? ??? ?}
?? ??? ??? ??? ?//當知道節點只有一個id屬性時:
?? ??? ??? ??? ?/*Element attr= (Element) booklist.item(i);
?? ??? ??? ??? ?String attributeValue=attr.getAttribute("id");
?? ??? ??? ??? ?System.out.println("id屬性的屬性值為:"+attributeValue);*/
?? ??? ??? ??? ?
?? ??? ??? ??? ?//下面解析book節點的子節點
?? ??? ??? ??? ?NodeList childNodes = book.getChildNodes();
?? ??? ??? ??? ?System.out.println("第"+(i+1)+"本書共有"+childNodes.getLength()+"個子節點");
?? ??? ??? ??? ?//獲取每個節點的節點名和節點值
?? ??? ??? ??? ?for(int k=0;k<childNodes.getLength();k++){
?? ??? ??? ??? ??? ?//區分出text類型的node及element類型的node
?? ??? ??? ??? ??? ?if(childNodes.item(k).getNodeType()==Node.ELEMENT_NODE){
?? ??? ??? ??? ??? ??? ?//獲取了element類型的節點的節點名
?? ??? ??? ??? ??? ??? ?System.out.print("第"+(k+1)+"個子節點的節點名稱是:"+childNodes.item(k).getNodeName());
?? ??? ??? ??? ??? ??? ?//兩者之間的區別是Element類型的節點值為空
?? ??? ??? ??? ??? ??? ?System.out.println("------"+childNodes.item(k).getFirstChild().getNodeValue());
??????? ? ? ? ??? //?? System.out.println("------"+childNodes.item(k).getTextContent());
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?System.out.println("===============循環結束==============");
?? ??? ?} catch (ParserConfigurationException e) {
?? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ?e.printStackTrace();
?? ??? ?}catch (SAXException e) {
?? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ?e.printStackTrace();
?? ??? ?} catch (IOException e) {
?? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ?e.printStackTrace();
?? ??? ?}
?? ?}
}

vue3 獲取dom,具體過程參見注釋。

首先,我們需要建立一個解析器工廠,以利用這個工廠來獲得一個具體的解析器對象。 

?????? 我們在這里使用DocumentBuilderFactory的目的是為了創建與具體解析器無關的程序,當DocumentBuilderFactory類的靜態方法newInstance()被調用時,它根據一個系統變量來決定具體使用哪一個解析器。

Xml文件?????? 又因為所有的解析器都服從于JAXP所定義的接口,所以無論具體使用哪一個解析器,代碼都是一樣的。

  所以當在不同的解析器之間進行切換時,值需要更改系統變量的值,而不用更改任何代碼。這就是工廠所帶來的好處。

????? 當獲得一個工廠對象之后,使用它的靜態方法newDocumentBuilder(),可以獲得一個DocumentBuilder對象

實例文件。  這個對象代表了具體的DOM解析器。

  解析器的具體實現對于程序來說并不重要。  

  然后,我們就可以利用這個解析器對文檔進行解析了。

  Sun公司提供了默認的工廠和默認的解析器,上面的例子中就使用了默認的解析器。

XML數據庫。?

轉載于:https://www.cnblogs.com/aa6055blog/p/4630140.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/147358.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息