私は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}]}
これらのエラーをキャッチしてエラーをスローするにはどうすればよいですか?