而是乙個可以使用字串表示的物件導向的文件模型。
今天的部落格使用我的 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...