回到简体

This commit is contained in:
chai2010
2016-02-15 11:06:34 +08:00
parent 9e878f9944
commit 2b37b23285
177 changed files with 2354 additions and 2354 deletions

View File

@@ -1,8 +1,8 @@
## 7.14. 示例: 基於標記的XML解
## 7.14. 示例: 基于标记的XML解
第4.5章展示了如何使用encoding/json包中的Marshal和Unmarshal函數來將JSON文檔轉換成Go言的數據結構。encoding/xml包提供了一相似的API。當我們想構造一個文檔樹的表示使用encoding/xml包很方便,但是對於很多程序不是必的。encoding/xml包也提供了一更低的基於標記的API用XML解。在基於標記的樣式中,解析器消費輸入和生一個標記流;四主要的標記類StartElementEndElementCharData和Comment每一都是encoding/xml包中的具體類型。每一個對(\*xml.Decoder).Token的調用都返迴一個標記
第4.5章展示了如何使用encoding/json包中的Marshal和Unmarshal函数来将JSON文档转换成Go言的数据结构。encoding/xml包提供了一相似的API。当我们想构造一个文档树的表示使用encoding/xml包很方便,但是对于很多程序不是必的。encoding/xml包也提供了一更低的基于标记的API用XML解。在基于标记的样式中,解析器消费输入和生一个标记流;四主要的标记类StartElementEndElementCharData和Comment每一都是encoding/xml包中的具体类型。每一个对(\*xml.Decoder).Token的用都返回一个标记
這里顯示的是和這個API相的部分:
这里显示的是和这个API相的部分:
<u><i>encoding/xml</i></u>
```go
@@ -33,9 +33,9 @@ func NewDecoder(io.Reader) *Decoder
func (*Decoder) Token() (Token, error) // returns next Token in sequence
```
這個沒有方法的Token接口也是一個可識别聯合的例子。傳統的接口如io.Reader的目的是隱藏滿足它的具體類型的細節,這樣就可以造出新的實現;在這個實現中每個具體類型都被一地待。相反,滿足可識别聯合的具體類型的集合被設計確定和暴露,而不是藏。可别的聯合類型幾乎沒有方法;操作它的函使用一個類型開關的case集合來進行表述;這個case集合中每一case中有不同的邏輯
这个没有方法的Token接口也是一个可识别联合的例子。传统的接口如io.Reader的目的是隐藏满足它的具体类型的细节,这样就可以造出新的实现;在这个实现中每个具体类型都被一地待。相反,足可识别联合的具体类型的集合被设计确定和暴露,而不是藏。可别的联合类型几乎没有方法;操作它的函使用一个类型开关的case集合来进行表述;这个case集合中每一case中有不同的逻辑
下面的xmlselect程序取和打印在一XML文檔樹中確定的元素下找到的文本。使用上面的API它可以在入上一次完成它的工作而從來不要具體化這個文檔樹
下面的xmlselect程序取和打印在一XML文档树中确定的元素下找到的文本。使用上面的API它可以在入上一次完成它的工作而从来不要具体化这个文档树
<u><i>gopl.io/ch7/xmlselect</i></u>
```go
@@ -89,9 +89,9 @@ func containsAll(x, y []string) bool {
}
```
每次main函中的循遇到一StartElement,它把這個元素的名稱壓到一個棧里;且每次遇到EndElement,它將名稱從這個棧中推出。這個API保了StartElement和EndElement的序列可以被完全的匹配甚至在一糟糕的文格式中。註釋會被忽略。xmlselect遇到一CharData時,隻有當棧中有序地包含所有通命令行參數傳入的元素名稱時它才會輸出相的文本。
每次main函中的循遇到一StartElement,它把这个元素的名称压到一个栈里;且每次遇到EndElement,它将名称从这个栈中推出。这个API保了StartElement和EndElement的序列可以被完全的匹配甚至在一糟糕的文格式中。注释会被忽略。xmlselect遇到一CharData时,只有当栈中有序地包含所有通命令行参数传入的元素名称时它才会输出相的文本。
下面的命令打印出任意出現在兩層div元素下的h2元素的文本。它的入是XML的明文檔,併且它自己就是XML文格式的。
下面的命令打印出任意出现在两层div元素下的h2元素的文本。它的入是XML的明文档,并且它自己就是XML文格式的。
```
$ go build gopl.io/ch1/fetch
@@ -108,11 +108,11 @@ html body div div h2: B Definitions for Character Normalization
...
```
**練習 7.17** 展xmlselect程序以便元素不僅僅可以通過名稱選擇,也可以通過它們CSS式上屬性進行選擇;例如一個像這樣<div id="page" class="wide">的元素可以通匹配id或者class同時還有它的名稱來進行選擇
**练习 7.17** 展xmlselect程序以便元素不仅仅可以通过名称选择,也可以通过它们CSS式上属性进行选择;例如一个像这样<div id="page" class="wide">的元素可以通匹配id或者class同时还有它的名称来进行选择
**練習 7.18** 使用基於標記的解API編寫一個可以取任意XML文檔和構造這個文檔所代表的普通節點樹的程序。節點有兩種類CharData節點表示文本字符串,和 Element節點表示被命名的元素和它們的屬性。每一元素節點有一個字節點的切片。
**练习 7.18** 使用基于标记的解API编写一个可以取任意XML文档和构造这个文档所代表的普通节点树的程序。节点有两种类CharData节点表示文本字符串,和 Element节点表示被命名的元素和它们的属性。每一元素节点有一个字节点的切片。
你可能發現下面的定義會對你有助。
你可能发现下面的定义会对你有助。
```go
import "encoding/xml"