XML命名空间的属性

时间:2017-08-19 10:26:44

标签: xml go

以下结构用于编组SAML XML元素,例如OrganizationNameOrganizationDisplayName& OrganizationURL

type LocalizedName struct {
    Lang  string `xml:"xml lang,attr"`
    Value string `xml:",chardata"`
}

Lang属性位于xml命名空间内。 encoding / xml包中生成的XML包含相对名称空间:

<Organization>
  <OrganizationName xmlns:_xml="xml" _xml:lang="en">name</OrganizationName>
  <OrganizationDisplayName xmlns:_xml="xml" _xml:lang="en">name</OrganizationDisplayName>
  <OrganizationURL xmlns:_xml="xml" _xml:lang="en">http://www.example.com/</OrganizationURL>
</Organization>

我期望元素不使用相对命名空间,因为它们似乎被认为是不安全的,although I do not understand why

<OrganizationName xml:lang="en">name</OrganizationName>

是什么原因导致创建相对名称空间?

1 个答案:

答案 0 :(得分:0)

如果您想生成这样的内容:

<OrganizationName xml:lang="en">name</OrganizationName>

您可以使用以下内容:

package main

import (
    "encoding/xml"
    "fmt"
)

//OrganizationName Name
type OrganizationName struct {
    XMLName xml.Name `xml:"OrganizationName"`
    Lang    string   `xml:"http://www.w3.org/XML/1998/namespace lang,attr,omitempty"`
    Value   string   `xml:",chardata"`
}

//Organization Organization Entity
type Organization struct {
    XMLName          xml.Name         `xml:"Organization"`
    OrganizationName OrganizationName `xml:"OrganizationName"`
}

func main() {
    v := Organization{
        OrganizationName: OrganizationName{
            Lang:  "en",
            Value: "Hisham Karam",
        },
    }
    output, err := xml.MarshalIndent(v, "  ", "    ")
    if err != nil {
        fmt.Printf("error: %v\n", err)
    }
    fmt.Printf("\n%s", string(output))

}

输出:

  <Organization>
      <OrganizationName xml:lang="en">Hisham Karam</OrganizationName>
  </Organization>

转到版本:

go version go1.10.3 darwin/amd64