4

我正在解析 XML,并且最多在文档的每一层,都有一个description.

这是一个玩具示例:

<obj>
    <description>outer object</description>
    <subobjA>
        <description>first kind of subobject</description>
        <foo>some goop</foo>
    </subobjA>
    <subobjB>
        <description>second kind of subobject</description>
        <bar>some other goop</bar>
    </subobjB>
</obj>

这意味着涉及的每个结构都有一个相同的Description成员,具有相同的 tag `xml:"description,omitempty"`

这是功能代码:http ://play.golang.org/p/1-co6Qcm8d

我宁愿描述标签是干燥的。显而易见的事情是:

type Description string `xml:"description,omitempty"`

然后Description始终使用该类型。但是,只有结构成员可以有标签。关于我想写的内容,请参见http://play.golang.org/p/p83UrhrN4u ;它不编译。

可以创建一个Description结构并重复嵌入它,但这会在访问时增加一层间接性。

还有其他方法可以解决这个问题吗?

4

1 回答 1

4

嵌入重构的Description结构(正如您已经建议的那样)是要走的路:

(操场)

type describable struct{
    Description string `xml:"description"`
}

type subobjA struct {
    describable
    XMLName     xml.Name `xml:"subobjA"`
}

type subobjB struct {
    describable
    XMLName     xml.Name `xml:"subobjB"`
}

type obj struct {
    XMLName     xml.Name `xml:"obj"`
    A           subobjA
    B           subobjB
}

提到的间接层不存在。要引用该主题的规范

如果 xf 是表示该字段或方法 f 的合法选择器,则结构 x 中的匿名字段的字段或方法 f 称为提升。

提升字段的作用类似于结构的普通字段,只是它们不能用作结构的复合文字中的字段名称。

所以你可以这样做:

err := xml.Unmarshal([]byte(sampleXml), &sampleObj)
fmt.Println(sampleObj.Description)
fmt.Println(sampleObj.A.Description)

sampleObj.describable.Description被提升为sampleObj.Description,所以这里没有进一步的间接层。

于 2013-05-07T00:30:08.963 回答