zoukankan      html  css  js  c++  java
  • go处理XML

    XML 数据格式

    对于如下的XML:

    <Person>
        <FirstName>Laura</FirstName>
        <LastName>Lynn</LastName>
    </Person>

    和 JSON 的方式一样,XML 数据可以序列化为结构,或者从结构反序列化为 XML 数据;

    encoding/xml 包实现了一个简单的 XML 解析器(SAX),用来解析 XML 数据内容。下面的例子说明如何使用解析器:

    示例  xml.go

    // xml.go
    package main
    
    import (
        "encoding/xml"
        "fmt"
        "strings"
    )
    
    var t, token xml.Token
    var err error
    
    func main() {
        input := "<Person><FirstName>Laura</FirstName><LastName>Lynn</LastName></Person>"
        inputReader := strings.NewReader(input)
        p := xml.NewDecoder(inputReader)
    
        for t, err = p.Token(); err == nil; t, err = p.Token() {
            switch token := t.(type) {
            case xml.StartElement:
                name := token.Name.Local
                fmt.Printf("Token name: %s
    ", name)
                for _, attr := range token.Attr {
                    attrName := attr.Name.Local
                    attrValue := attr.Value
                    fmt.Printf("An attribute is: %s %s
    ", attrName, attrValue)
                    // ...
                }
            case xml.EndElement:
                fmt.Println("End of token")
            case xml.CharData:
                content := string([]byte(token))
                fmt.Printf("This is the content: %v
    ", content)
                // ...
            default:
                // ...
            }
        }
    }

    输出:

    Token name: Person
    Token name: FirstName
    This is the content: Laura
    End of token
    Token name: LastName
    This is the content: Lynn
    End of token
    End of token

    包中定义了若干 XML 标签类型:StartElement,Chardata(这是从开始标签到结束标签之间的实际文本),EndElement,Comment,Directive 或 ProcInst。

    包中同样定义了一个结构解析器:NewParser 方法持有一个 io.Reader(这里具体类型是 strings.NewReader)并生成一个解析器类型的对象。还有一个 Token() 方法返回输入流里的下一个 XML token。在输入流的结尾处,会返回(nil,io.EOF)

    XML 文本被循环处理直到 Token() 返回一个错误,因为已经到达文件尾部,再没有内容可供处理了。通过一个 type-switch 可以根据一些 XML 标签进一步处理。Chardata 中的内容只是一个 []byte,通过字符串转换让其变得可读性强一些。

    JSON 数据格式

    我们都比较熟悉 XML 格式(参阅 12.10);但有些时候 JSON(JavaScript Object Notation,参阅 http://json.org)被作为首选,主要是由于其格式上非常简洁。通常 JSON 被用于 web 后端和浏览器之间的通讯,但是在其它场景也同样的有用。

    这是一个简短的 JSON 片段:(与上面XML同义)

    {
        "Person": {
            "FirstName": "Laura",
            "LastName": "Lynn"
        }
    }

    尽管 XML 被广泛的应用,但是 JSON 更加简洁、轻量(占用更少的内存、磁盘及网络带宽)和更好的可读性,这也使它越来越受欢迎。

    示例  json.go

    // json.go
    package main
    
    import (
        "encoding/json"
        "fmt"
        "log"
        "os"
    )
    
    type Address struct {
        Type    string
        City    string
        Country string
    }
    
    type VCard struct {
        FirstName string
        LastName  string
        Addresses []*Address
        Remark    string
    }
    
    func main() {
        pa := &Address{"private", "Aartselaar", "Belgium"}
        wa := &Address{"work", "Boom", "Belgium"}
        vc := VCard{"Jan", "Kersschot", []*Address{pa, wa}, "none"}
        // fmt.Printf("%v: 
    ", vc) // {Jan Kersschot [0x126d2b80 0x126d2be0] none}:
        // JSON format:
        js, _ := json.Marshal(vc)
        fmt.Printf("JSON format: %s", js)
        // using an encoder:
        file, _ := os.OpenFile("vcard.json", os.O_CREATE|os.O_WRONLY, 0666)
        defer file.Close()
        enc := json.NewEncoder(file)
        err := enc.Encode(vc)
        if err != nil {
            log.Println("Error in encoding json")
        }
    }

    转载自:https://github.com/unknwon/the-way-to-go_ZH_CN/blob/master/eBook/12.10.md

  • 相关阅读:
    SAP MM 有了采购订单历史的PO行项目里的采购附加费不允许再改了?
    风之语.人在职场也需要'备胎'
    两万字,任正非采访全记录
    SAP 如何得到交货单上的序列号清单?
    【2019年版】如何向SAP公司提交Message?
    工作上996,生活上669,并不是什么难事儿!
    风之语.甲骨文裁员之我见
    天河2号-保持使用yhrun/srun时连接不中断 (screen 命令教程 )
    PXE 和 计算机网络启动
    Gmail 设置,时区
  • 原文地址:https://www.cnblogs.com/lfri/p/11768826.html
Copyright © 2011-2022 走看看