英文:
encoding/xml handle unmapped elements
问题
从http://golang.org/pkg/encoding/xml/#Unmarshal
> * 如果XML元素包含一个未匹配上述规则的子元素,并且结构体具有带有标签",any"的字段,
> unmarshal将该子元素映射到该结构体字段。
我在将XML信封的剩余部分放入我的结构体中遇到了问题(以显示我有一个不完整的映射)
http://play.golang.org/p/mnFqAcguJQ
我知道你可以使用mgo包中的bson.M来完全使用这种方法,使用,inline - 但是看起来map[string]interface{}在这里不是答案。
编辑:
经过一些额外的尝试,我发现了一些我认为是额外的意外行为。
将类型切换为[]string开始接受输入,但没有键/值对:http://play.golang.org/p/wCAJeeQa4m
我还计划调整encode/xml以解析HTML。我在文档中没有看到如果一个元素存在多次,它将保存最后一个实例而不是报错:http://play.golang.org/p/0MY__R-Xi3
英文:
From http://golang.org/pkg/encoding/xml/#Unmarshal
> * If the XML element contains a sub-element that hasn't matched any of the above rules and the struct has a field with tag ",any",
> unmarshal maps the sub-element to that struct field.
I'm having trouble getting the remainder of an XML envelope into my struct (to show that I have an incomplete mapping)
http://play.golang.org/p/mnFqAcguJQ
I know you can use exactly this method with bson.M from the mgo packages using ,inline - but it looks like map[string]interface{} isn't the answer here.
EDIT:
After some additional playing, I've found what I believe to be some additional unexpected behavior.
Switching to []string as a type starts to accept input, but no key/value pairs: http://play.golang.org/p/wCAJeeQa4m
I also planned on adapting encode/xml in order to parse html. I do not see in the documentation that if an element exists more than once, it will save the last instance of it, rather than erroring out: http://play.golang.org/p/0MY__R-Xi3
答案1
得分: 5
这里是链接:http://play.golang.org/p/iY8YlxYym0
由于c
是具体的内容,不应该使用",any"
,因此它应该有一个结构体定义。C
本身包含一个任意标签的列表,因此它应该包含一个[]Tag xml:'",any"'
... 现在要捕获Tag
本身,你需要使用xml.Name
来获取标签名和",innerxml"
的内容。
最终的结果如下:
const xmlString = `<foo><a>1</a><b>2</b><c><c1>3</c1><c2>4</c2></c></foo>`
type Foo struct {
A int `xml:"a"`
B int `xml:"b"`
C Extra `xml:"c"`
}
type Extra struct {
Items []Tag `xml:",any"`
}
type Tag struct {
XMLName xml.Name
Content string `xml:",innerxml"`
}
或者更简洁的版本:
type Foo struct {
A int `xml:"a"`
B int `xml:"b"`
C struct {
Items []struct {
XMLName xml.Name
Content string `xml:",innerxml"`
} `xml:",any"`
} `xml:"c"`
}
对于HTML,可以使用go.net/html。使用xml解析器解析HTML会比较复杂。
英文:
Here: http://play.golang.org/p/iY8YlxYym0
Since c
is something concrete, it shouldn't use ",any"
, hence it should have a struct definition. C
itself contains a list of arbitrary tags, hence it should contain an []Tag xml:'",any"'
... now to capture the Tag
itself, you need xml.Name to get the tag name and something with ",innerxml".
Finally the result is this:
const xmlString = `<foo><a>1</a><b>2</b><c><c1>3</c1><c2>4</c2></c></foo>`
type Foo struct {
A int `xml:"a"`
B int `xml:"b"`
C Extra `xml:"c"`
}
type Extra struct {
Items []Tag `xml:",any"`
}
type Tag struct {
XMLName xml.Name
Content string `xml:",innerxml"`
}
Or the shorter version:
type Foo struct {
A int `xml:"a"`
B int `xml:"b"`
C struct {
Items []struct {
XMLName xml.Name
Content string `xml:",innerxml"`
} `xml:",any"`
} `xml:"c"`
}
For HTML there is go.net/html. Using xml parser for html will be complicated.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论