0

私はgolangの初心者で、XMLパーサーを書いています。

私の目標は、xml ファイルが正しくフォーマットされているかどうかのチェックを含め、要素と属性の括弧の欠落やスペルミスの単語をチェックすることです。かっこの欠落やスペルミスのある単語がある場合、コードは例外をスローして、ユーザーに間違いを修正するよう通知する可能性があります。

xml ファイルの具体的な例を見てみましょうexample.xml

<?xml version="1.0" encoding="utf-8"?>

<servers version="1">
    <server>
        <model name="Cisco" type="modelA"></model>
        <serverName>Tokyo_VPN</serverName>
        <serverIP>127.0.0.1</serverIP>
    </server>
    <server>
        <model name="Dell" type="modelB"></model>
        <serverName>Moscow_VPN</serverName>
        <serverIP>127.0.0.2</serverIP>
    </server>
</servers>

標準の Go パッケージを使用する"encoding/xml"と、次のように構造を定義して XML を解析するのは簡単です。

package main

import (
    "encoding/xml"
    "fmt"
    "io/ioutil"
    "os"
)

type Servers struct {
    XMLName     xml.Name `xml:"servers"`
    Version     string   `xml:"version,attr"`
    Svs         []server `xml:"server"`
}

type server struct {
    XMLName    xml.Name `xml:"server"`
    Model      model    `xml:"model"`
    ServerName string   `xml:"serverName"`
    ServerIP   string   `xml:"serverIP"`
}

type model struct {
    XMLName    xml.Name   `xml:"model"` 
    Name       string     `xml:"name,attr"`
    Type       string     `xml:"type,attr"`  
}


func main() {

    // open the xml file
    file, err := os.Open("toy.xml")  
    if err != nil {
        fmt.Printf("error: %v", err)
        return
    }
    defer file.Close()

    // read the opened xmlFile as a byte array.
    byteValue, _ := ioutil.ReadAll(file)

    var allservers Servers

    err = xml.Unmarshal(byteValue, &allservers)
    if err != nil {
        fmt.Printf("error: %v", err)
        return
    }

    fmt.Println(allservers)
}

かっこの欠落などの間違い

<model name="Cisco" type="modelA"></model

またはスペルミスの属性/要素、例えば

<serverNammme>Moscow_VPN</serverName>

、これらのエラーは XML 構文エラーによってキャッチされます。

ただし、発生する可能性のある他のエラーがあります。たとえば、属性のスペルミスのある単語:

<model namMMe="Cisco" typeE="modelA"></model>

これは有効な XML 形式ですが、(私の目的では) これらは入力 XML ファイルのスペルミスであり、修正する必要があるため、これをエラーとして捉えたいと思います。

これはエラーなしで解析され、次のようになります。

{{ servers} 1 [{{ server} {{ model}  } Tokyo_VPN 127.0.0.1} {{ server} {{ model} Dell modelB} Moscow_VPN 127.0.0.2}]}

これらのエラーをキャッチしてエラーをスローするにはどうすればよいですか?

4

1 に答える 1

0

encoding/xml のドキュメントに行くと

https://golang.org/pkg/encoding/xml/#Unmarshal

カスタム マーシャル/アンマーシャルを記述する例があります. アンマーシャラー インターフェースを実装するだけで済みます.

したがって、カスタム Unmarshaler は、非マーシャリング中に値をチェックしてエラーを返すことができます

于 2020-09-03T04:29:22.863 に答える