【问题标题】:Go - Unmarshal XML, Attribute issuesGo - Unmarshal XML,属性问题
【发布时间】:2016-03-08 17:58:25
【问题描述】:

也许有人可以在这里提供一些见解...我似乎在使用编码/XML 库时遇到了障碍。

在我的一生中,我无法从 复制有效的 XML 属性 基本上我正在从 GPS 文件中解组 XML 数据,然后将其编组回另一个文件。一切正常,除了根 XML

的属性标签

我尝试了各种

func (c *gpx) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {} 

键入方法无济于事。

基本上我只希望根标签 正确分配所有属性。为什么你不能做 Attributes []xml.Attr xml:",attr" 或类似的事情超出了我的理解。

良好的 XML 标头 -> http://pastebin.com/XjEZuBa1

我无法链接错误的 XML 标头,因为我是新成员。但是 XML 解组/编组过程将 _ 添加到名称空间中,这会导致问题等。

GO Playground 链接:http://play.golang.org/p/J7wy6306Cj

任何帮助将不胜感激, 谢谢。

【问题讨论】:

  • 欢迎来到 SO。作为提示,添加带有MCVEPlayground 链接可以帮助人们帮助您。
  • 感谢您的回复。我在 Go Playground 中放了一些代码。我相信这复制了我遇到的问题。 play.golang.org/p/J7wy6306Cj
  • 你的问题是那些应该是xmlns:foo_xmlns:foo吗?
  • 命名空间是问题之一,但输出 XML 属性与传入属性完全不同。例如,如果我在一个巨大的 GPS 文件上运行我的程序,它不会导入到 Garmin Basecamp,直到我替换 标题。

标签: go xml-parsing


【解决方案1】:

不幸的是,默认的 Go XML 编码器无法编码

xmlns:foo="http://example.com/Foo-V1" foo:attr="bar"

作为the code shows,它根据URL选择名称,你不能只自己定义命名空间。 Go 编码器发出这样的代码,AFAIK 基本上等同于上面的代码:

xmlns:Foo-V1="http://example.com/Foo-V1" Foo-V1:attr="bar"

这里唯一不同的是命名空间的前缀。

至于其他命名空间的前向声明,我建议只在需要它们的元素和属性上声明它们。 IE。编码类似的东西

<foo xmlns:bar="http://example.com/Bar-V1">
  <bar:elem>Hello world</bar:elem>
</foo>

使用这样的结构

type Foo struct {
    XMLName xml.Name `xml:"foo"`
    BarElem BarElem
}

type BarElem struct {
    XMLName xml.Name `xml:"http://example.com/Bar-V1 elem"`
    Data    string   `xml:",innerxml"`
}

序列化为

<foo>
  <elem xmlns="http://example.com/Bar-V1">Hello world</elem>
</foo>

游乐场:http://play.golang.org/p/79bhk70yFj.

【讨论】:

  • 接受的答案。你是对的,这是 Go 的 XML 编码器的限制。不幸的是,Garmin Basecamp 对 XML 属性的表示方式非常挑剔。因此,我执行了一些基本的字符串操作以获得所需的结果。不幸的是,因为其他语言(未提及任何名称)很容易给出所需的结果。
猜你喜欢
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2012-07-14
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
相关资源
最近更新 更多