英文:
Go: XML Unmarshal nested key-value pairs
问题
我开始了一个处理XML输入的项目,但在unmarshal方法中遇到了问题。我试图将下面的XML解组为一个结构体。在XML中有多个'value'标签,这是可以的,但在'value'标签内部,可以有一个带有值的'value'标签,或者有多个带有'key'和'value'标签的'value'标签。我试图在Go结构体中捕获这个情况,但迄今为止没有成功。
<lines>
<values>
<key>Key_1</key>
<value>Value_1</value>
</values>
<values>
<key>Key_2</key>
<value>
<key>NestedKey_1</key>
<value>NestedValue_1</value>
</value>
<value>
<key>NestedKey_2</key>
<value>NestedValue_2</value>
</value>
</values>
</lines>
Go结构体:
type Value struct {
Key string `xml:"key"`
Value string `xml:"value"`
}
type Values struct {
Key string `xml:"key"`
Value []Value `xml:"value"`
}
type Lines struct {
Values []Values `xml:"values"`
}
当我打印unmarshal的输出时,我可以看到Key_1和Key_2以及嵌套的键值对,但是我在输出中看不到Value_1。这是显而易见的,因为它是一个字符串而不是数组,有人有办法解决这个问题吗?
Playground: http://play.golang.org/p/I4U0lhPt5U
英文:
I started a project to process XML input, I ran into a problem with the unmarshal method. I'm trying to umarshal the XML below into a struct. The are multiple 'values' tag, which is fine, but within the 'values' tag there can be either one 'value' tag with a value. Or there are multiple 'value' tags with a 'key'&'value' tag inside. I'm trying to capture this in a Go struct, but no luck so far..
<lines>
<values>
<key>Key_1</key>
<value>Value_1</value>
</values>
<values>
<key>Key_2</key>
<value>
<key>NestedKey_1</key>
<value>NestedValue_1</value>
</value>
<value>
<key>NestedKey_2</key>
<value>NestedValue_2</value>
</value>
</values>
</lines>
Go struct:
type Value struct {
Key string `xml:"key"`
Value string `xml:"value"`
}
type Values struct {
Key string `xml:"key"`
Value []Value `xml:"value"`
}
type Lines struct {
Values []Values `xml:"values"`
}
When I print the unmarshal output, I do see Key_1 and Key_2 and the nested key-value pairs, but I don't see Value_1 in the output. Which is obvious since it's a string and not an array, anyone an idea how to work around this?
Playground: http://play.golang.org/p/I4U0lhPt5U
答案1
得分: 1
两个需要注意的事项:
-
表示 XML 元素内容的
struct
类型可能有一个特殊字段 "XMLName",类型为xml.Name
。这可以用来使类型的名称与 XML 元素的名称不同。
-
通过 "xml" 标签为你的
struct
类型的字段指定的 XML 元素的名称可以使用>
符号来指定元素的嵌套关系,例如:Foo string `xml:"a>b>c"`
这可以用来跳过不需要的中间(包围)元素,直接提取感兴趣的子元素。
所有这些内容在 该包的 Unmarshal()
函数的文档中有详细解释。
据说,这些功能应该能够帮助你解决问题。
如果你发现你的情况确实非常特殊,很难通过普通的解组来处理,你可以尝试使用 XPath 来解决。
英文:
Two things to look at:
-
A
struct
type representing the contents of an XML element might have a special field "XMLName" of typexml.Name
.This can be used to have types named differently from XML elements.
-
The name of an XML element specified for a field of your
struct
type via the "xml" tag might specify nesting of elements using the>
notation, like inFoo string `xml:"a>b>c"`
This can be used to skip unneeded intermediate (enclosing) elements and directly extract their child elements of interest.
All this stuff is explained in the package's doc for the Unmarshal()
func.
Supposedly, these capabilities should allow you to deal with your problem.
If you will find that your case is truly pathological and is hard to deal with plain unmarshaling, you might try to approach it using XPath.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论