xml - 使用 Go 解析时如何检查输入 XML 中的错误?

标签 xml parsing go exception misspelling

我是 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}]}
我怎样才能捕捉到这些错误并抛出错误?

最佳答案

如果你去 encoding/xml 的文档
https://golang.org/pkg/encoding/xml/#Unmarshal
有一个编写自定义 Marshal/Unmarshal 的例子,你只需要实现 Unmarshaler 接口(interface)
因此,您的自定义 Unmarshaler 可以在解码时检查值并返回错误

关于xml - 使用 Go 解析时如何检查输入 XML 中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63715329/

相关文章:

xml - 使用带有 XPATH 的 vb.net 读取 XML 属性

javascript - 使用 javascript 从 JSON url 解析数据

json - 无法在 golang 中解析此 json 文件

amazon-web-services - 使用 Golang 从 Lambda 调用 AppSync Mutation

android - NetInfo react-native ,添加到 AndroidManifest.xml

c# - 在 XML 异常处理期间,如何获取导致异常的 XML 文件中的行号?

java - 使用 org.json 解析 Java 中 JSONArray 中的内部 JSON 文件

parsing - FParsec:如何保存解析器成功的文本

excel - 使用 excelize Golang 时公式错误

c# - XmlDocument 在 Visual Studio 2012 DLL 构建中不可用