xml - 解码命名空间 XML 标签 - Golang

标签 xml go unmarshalling

我正在尝试从 .odt 文档中提取元数据。

包含 XML 的文件称为 meta.xml

它的结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"  xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" office:version="1.2">
    <office:meta>
        <meta:creation-date>2016-10-18T15:05:19.137453293</meta:creation-date>
        <dc:title>Document</dc:title>
        <dc:date>2017-01-17T00:59:04.731054728</dc:date>
        <meta:document-statistic meta:page-count="1" meta:word-count="0" meta:character-count="0"/>
    </office:meta>
</office:document-meta>

我使用 encoding/xml 包中的 xml.Unmarshal() 来解析 XML 并将值放入结构字段中。

这是我正在使用的结构:

type Query struct {
    CreationDate string `xml:""`
    PageCount int `xml:""`
    WordCount int `xml:""`
    CharCount int `xml:""`
}

我从可用文档中了解到,我可以使用 xml:"tag-name" 类型的字段标签来获取 XML 标签的值,以及 xml:name, attr 获取属性值。

但是,由于 XML 文件具有命名空间标签(例如 meta:creation-date),到目前为止我尝试过的所有操作都使结构字段为空。虽然,我可能做错了什么。

这是 Go Playground 中的整个程序: https://play.golang.org/p/n7C50l1gsV

最佳答案

如果您的结构相当直接地映射到 XML,您会发现事情会进展得更顺利。此代码应该可以帮助您入门:

package main

import (
    "encoding/xml"
    "fmt"
)

type Stats struct {
    XMLName   xml.Name
    PageCount int `xml:"page-count,attr"`
}

type Meta struct {
    XMLName xml.Name
    Date    string `xml:"creation-date"`
    Title   string `xml:"title"`
    Stats   Stats  `xml:"document-statistic"`
}

type DocumentMeta struct {
    XMLName xml.Name
    Meta    Meta `xml:"meta"`
}

var data = []byte(`<?xml version="1.0" encoding="UTF-8"?>
<office:document-meta>
    <office:meta>
        <meta:creation-date>2016-10-18T15:05:19.137453293</meta:creation-date>
        <dc:title>Document</dc:title>
        <dc:date>2017-01-17T00:59:04.731054728</dc:date>
        <meta:document-statistic meta:page-count="1" meta:word-count="0" meta:character-count="0"/>
    </office:meta>
</office:document-meta>`)

func main() {
    var dm DocumentMeta
    xml.Unmarshal(data, &dm)
    fmt.Println(dm)
}

关于xml - 解码命名空间 XML 标签 - Golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42209427/

相关文章:

带有方法和参数的 Java EE outputText,在 dataTable 中

java - 无法将条目强制转换为 javax.xml.bind.JAXBElement

java - JAXB 解码到实体错误

go - 在 golang 中使用发送网格?

go - 当我尝试模拟扇入时陷入僵局 - 通过阶乘计算扇出

go - 唯一性约束不会阻止在 Neo4j 上添加相同的数据

java - 使用 Castor XML 映射解码时忽略字段

html - XQuery://vs descendant-or-self::node()

java - 扫描不适用于 logback.xml

php - 无法通过xpath()(YT channel 供稿)访问XML节点