RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1442640
Accepted
ar rr
ar rr
Asked:2022-08-25 19:03:04 +0000 UTC2022-08-25 19:03:04 +0000 UTC 2022-08-25 19:03:04 +0000 UTC

XML解码Golang

  • 772

我正在练习 xml 解码,但我遇到了问题。出于某种原因,解码时,Unmarshal 函数仅解码结构的第一个元素。所有其他的都被忽略,尽管它们是在 byteValue 变量中读取的。有一个 XML 结构

<?xml version="1.0" encoding="UTF-8"?>
 <Person id="13">
  <name>
   <first>Abigail</first>
   <last>Moriarti</last>
  </name>
 </Person> <Person id="15">
  <name>
   <first>James</first>
   <last>Willow</last>
  </name>
 </Person> <Person id="16">
  <name>
   <first>Margareth</first>
   <last>O"Nil</last>
  </name>
 </Person> <Person id="17">
  <name>
   <first>Lowan</first>
   <last>de Vega</last>
  </name>
 </Person>

我的解密代码:

type Person struct {
    XMLName   xml.Name `xml: "person"`
    Id        int      `xml:"id,attr"`
    FirstName string   `xml:"name>first"`
    LastName  string   `xml:"name>last"`
}

func FullDecode() {
    xmlFile, err := os.Open("EncodeData.xml")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println("Successfully Opened EncodeData.xml")
    defer xmlFile.Close()

    byteValue, _ := ioutil.ReadAll(xmlFile)
    var persons []Person
    err = xml.Unmarshal(byteValue, &persons)
    if err != nil {
        log.Fatal("Cannot Decode xml")
    }
    Writefile, err := os.Create("DecodeData.txt")

    for _, person := range persons {
        finastring := string(person.Id) + " " + person.FirstName + " " + person.LastName
        Writefile.WriteString(finastring)
    }
}

结果值:

1.
2. Abigail Moriarti

为什么在这个例子中 Unmarshal 不解码整个文件,而是在第一个元素处停止?

xml
  • 1 1 个回答
  • 33 Views

1 个回答

  • Voted
  1. Best Answer
    Pak Uula
    2022-08-26T12:45:35Z2022-08-26T12:45:35Z

    在 XML 文档中,顶层必须只有一个元素。如果有多个这样的元素,那么它就是一个无效的 XML 文档。

    您需要将人员列表包装在某种标签中。例如<persons></persons>:

    <?xml version="1.0" encoding="UTF-8"?>
    <persons>
        <person id="13">
            <name>
                <first>Abigail</first>
                <last>Moriarti</last>
            </name>
        </person>
        <person id="15">
            <name>
                <first>James</first>
                <last>Willow</last>
            </name>
        </person>
        <person id="16">
            <name>
                <first>Margareth</first>
                <last>O"Nil</last>
            </name>
        </person>
        <person id="17">
            <name>
                <first>Lowan</first>
                <last>de Vega</last>
            </name>
        </person>
    </persons>
    

    这是成功解析此类 XML 的示例代码。Persons []Person在结构中要注意Persons——正是这个数组向解析器表明person可以有多个元素。

    package main
    
    import (
        "encoding/xml"
        "fmt"
        "os"
    )
    
    func parseXMLFile[T any](fileName string, dst *T) error {
        bytes, err := os.ReadFile(fileName)
        if err != nil {
            return err
        }
    
        return xml.Unmarshal(bytes, dst)
    }
    
    type Person struct {
        XMLName   xml.Name `xml:"person"`
        Id        int      `xml:"id,attr"`
        FirstName string   `xml:"name>first"`
        LastName  string   `xml:"name>last"`
    }
    
    type Persons struct {
        XMLName xml.Name `xml:"persons"`
        Persons []Person `xml:"person"`
    }
    
    func main() {
        var persons Persons
    
        if err := parseXMLFile("persons.xml", &persons); err != nil {
            panic(err)
        }
    
        fmt.Printf("Persons: %v\n", persons.Persons)
    }
    

    更新

    如果您需要解析不正确的 XML 文件,则可以使用流式解码器来完成xml.Decoder

    无效文件persons2.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    
        <person id="13">
            <name>
                <first>Abigail</first>
                <last>Moriarti</last>
            </name>
        </person>
        <person id="15">
            <name>
                <first>James</first>
                <last>Willow</last>
            </name>
        </person>
        <person id="16">
            <name>
                <first>Margareth</first>
                <last>O"Nil</last>
            </name>
        </person>
        <person id="17">
            <name>
                <first>Lowan</first>
                <last>de Vega</last>
            </name>
        </person>
    

    如何解析它:

    func main() {
        bz, err := os.ReadFile("persons2.xml")
        if err != nil {
            panic(err)
        }
        r := bytes.NewReader(bz)
        d := xml.NewDecoder(r)
    
        var person Person
        for d.Decode(&person) == nil {
            fmt.Printf("Person: %v\n", person)
        }
    }
    

    循环调用,d.Decode直到调用返回错误。结果(https://go.dev/play/p/qfMb1kclPSi):

    Person: {{ person} 13 Abigail Moriarti}
    Person: {{ person} 15 James Willow}
    Person: {{ person} 16 Margareth O"Nil}
    Person: {{ person} 17 Lowan de Vega}
    
    • 3

相关问题

  • 贴在屏幕顶部(将视图固定到 NestedScrollView 的顶部) | 科特林

  • XSLT 中的 XPath 问题

  • 使用 xsl:if 选择 position()

  • 如何在 PL/SQL 过程中仅将包含 XML 的 CLOB 部分转换为 xmlType?

  • 带有 xsl 样式的 xml 在 Google Chrome 浏览器中不显示

  • SVG中动画重复之间的延迟

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5