XML的方法 第2部分 SAX呢?

2021-10-08 01:15:30 字數 2104 閱讀 2827

而是乙個可以使用字串表示的物件導向的文件模型。

今天的部落格使用我的 pete的「完​​美披薩」 場景 繼續了此討論 。

如果你還記得的話,皮特只是把頭撞在門上

並要求您增強系統,以便前台可以在單個xml訊息中傳送多個披薩的訂單。

您知道您的簡單字串解析**有缺陷,不會割裂芥末,因此您 在xml上使用了 google 1 並提出了使用sax的想法。

回到pete ,您將努力工作,並提出以下基於sax解析器的類:

public class pizzaparser  catch (exception ex) 

} static class pizzaorder

public string getpizzaname()

public string getbase()

public string getquantity()

} /**

* use this class the handle the sax events

*/class pizzacontenthandler extends defaulthandler

/*** handle the startelement event

*/@override

public void startelement(string uri, string localname, string qname, attributes attributes) else if ('pizza'.equals(qname)) else if ('name'.equals(qname)) else if ('base'.equals(qname)) else if ('quantity'.equals(qname))

}/**

* handle the endelement event

*/@override

public void endelement(string uri, string localname, string qname)

}/**

* grab hold of incoming character data

*/@override

public void characters(char ch, int start, int length)

}listgetpizzaorder()

}}

該部落格不是在這裡演示如何使用sax,如果您看看周圍有很多可用的示例,但是讓我們仔細看一下**,首先要注意的是order(...)方法現在將輸入流而不是字串作為適合基於流的api:

public listorder(inputstream xml)
接下來要注意的是, pizzaparser使用巢狀類pizzacontenthandler ,該類擴充套件了sax幫助程式類defaulthandler 。 pizzacontenthandler類將捕獲pizzaorder bean的列表,並將它們傳遞歸封閉類,以返回給呼叫者。 這意味著要掌握sax事件,您需要做的就是重寫處理程式方法,例如startelement(...) , endelement(...)等。

如果仔細看一下**,您會發現它非常複雜。 它要做的就是建立乙個輸出列表,但是有多個if()語句,臨時陣列和布林開關用於從文件的正確位置獲取正確的資訊。 這是sax的缺點:它的複雜性給程式設計師帶來了更多負擔,並使您的**更容易出錯。

但是,它比以前的基於字串的嘗試更具彈性,如下面的單元測試所示:

public class pizzaparsertest 

@test

public void readorderfromxml()

@test

public void readorderfrommodifiedxml()

@test

public void readorderformultiplepizza()

}

這些測試演示了處理帶有和不帶有空格(解決昨天的問題)的xml訊息以及包含多個比薩餅訂單的訊息的場景。

1其他搜尋引擎可用。

可從github上獲得源**:

git:

參考:

XML的方法 第1部分 XML不是字串

從計算的角度來看,它是一種成熟的產品,具有悠久的歷史。那麼,有什麼我可以新增到該主題的新東西嗎?xml的處理方式實際上取決於您和您的情況,重點是 情況 在乙個極端情況下,您可能會參與乙個舒適的 內部 專案,其中乙個內部系統必須與另乙個系統對話。在另一種極端情況下,您處於一種xml模式下,這種模式將有...

什麼是SOLID原則(第2部分)

翻譯自 what s the deal with the solid principles?part 2 在文章的 第1部分,我們主要討論了前兩個 solid 原則,它們分別是單一職責原則和開閉原則。在這一部分,我們將按照首字母縮略詞中的順序來處理接下來的兩個原則。讓我們啟程吧!在 solid 原則...

重構練習 大二作業 第2部分

現在開始修改資料結構。當初我在寫 的時候不知道抽了什麼風,過載了一大堆比較函式,還都是友元函式。friend bool operator bigamount ba1,bigamount ba2 friend bool operator long long ba1,bigamount ba2 frie...