如何省略外部 XML 元素的名称
How to omit names of outer XML elements
我需要生成 XML 个这样的文件:
<package>
<dc:contributor id="creator1">John Doe</dc:contributor>
<meta refines="creator1" property="role" scheme="marc:relators">aut</meta>
<meta refines="creator1" property="role" scheme="onix:codelist17">A01</meta>
<meta refines="creator1" property="file-as">Doe, John</meta>
<meta refines="creator1" property="diplay-seq">1</meta>
<dc:contributor id="reviewer1">Mary Poppins</dc:contributor>
<meta refines="reviewer1" property="role" scheme="marc:relators">rev</meta>
<meta refines="reviewer1" property="file-as">Poppins, Mary</meta>
<meta refines="reviewer1" property="diplay-seq">1</meta>
<dc:contributor id="translator1">Alfred Weasley</dc:contributor>
<meta refines="translator1" property="role" scheme="marc:relators">trl</meta>
<meta refines="translator1" property="role" scheme="onix:codelist17">B06</meta>
<meta refines="translator1" property="file-as">Weasley, Alfred</meta>
<meta refines="translator1" property="diplay-seq">1</meta>
</package>
这里的顺序很重要。
我使用这个结构:
type Pack struct {
XMLName struct{} `xml:"package"`
People []PersonWrapper `xml:""` // <-- is this the problem?
}
type Person struct {
Id string `xml:"id,attr"`
Name string `xml:"-"`
Surname string `xml:"-"`
FullName string `xml:",innerxml"`
}
type Meta struct {
Refines string `xml:"refines,attr"`
Property string `xml:"property,attr"`
Scheme string `xml:"scheme,attr,omitempty"`
Value string `xml:",innerxml"`
}
type PersonWrapper struct {
Person Person `xml:"dc:contributor"`
Metas []Meta `xml:"meta"`
}
有了这个我得到了:
<package>
<People>
<dc:contributor id="creator1">John Doe</dc:contributor>
<meta refines="creator1" property="role" scheme="marc:relators">aut</meta>
<meta refines="creator1" property="role" scheme="onix:codelist17">A01</meta>
<meta refines="creator1" property="file-as">Doe, John</meta>
<meta refines="creator1" property="diplay-seq">1</meta>
</People>
<People>
<dc:contributor id="reviewer1">Mary Poppins</dc:contributor>
<meta refines="reviewer1" property="role" scheme="marc:relators">rev</meta>
<meta refines="reviewer1" property="file-as">Poppins, Mary</meta>
<meta refines="reviewer1" property="diplay-seq">1</meta>
</People>
<People>
<dc:contributor id="translator1">Ben Weasley</dc:contributor>
<meta refines="translator1" property="role" scheme="marc:relators">trl</meta>
<meta refines="translator1" property="role" scheme="onix:codelist17">B06</meta>
<meta refines="translator1" property="file-as">Weasley, Ben</meta>
<meta refines="translator1" property="diplay-seq">1</meta>
</People>
</package>
如何去除 <People/>
外标签?我试图将内部结构包装到更高级别的其他结构中,但无法达到所需的结构。
您可以为 PersonWrapper
实现 xml.Marshaler
接口(并将 xmlnames 添加到嵌套结构)。
type Pack struct {
XMLName struct{} `xml:"package"`
People []PersonWrapper
}
type Person struct {
XMLName xml.Name `xml:"dc:contributor"`
Id string `xml:"id,attr"`
Name string `xml:"-"`
Surname string `xml:"-"`
FullName string `xml:",innerxml"`
}
type Meta struct {
XMLName xml.Name `xml:"meta"`
Refines string `xml:"refines,attr"`
Property string `xml:"property,attr"`
Scheme string `xml:"scheme,attr,omitempty"`
Value string `xml:",innerxml"`
}
type PersonWrapper struct {
Person Person `xml:"dc:contributor"`
Metas []Meta `xml:"meta"`
}
func (pw PersonWrapper) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
if err := e.Encode(pw.Person); err != nil {
return err
}
if err := e.Encode(pw.Metas); err != nil {
return err
}
return nil
}
我需要生成 XML 个这样的文件:
<package>
<dc:contributor id="creator1">John Doe</dc:contributor>
<meta refines="creator1" property="role" scheme="marc:relators">aut</meta>
<meta refines="creator1" property="role" scheme="onix:codelist17">A01</meta>
<meta refines="creator1" property="file-as">Doe, John</meta>
<meta refines="creator1" property="diplay-seq">1</meta>
<dc:contributor id="reviewer1">Mary Poppins</dc:contributor>
<meta refines="reviewer1" property="role" scheme="marc:relators">rev</meta>
<meta refines="reviewer1" property="file-as">Poppins, Mary</meta>
<meta refines="reviewer1" property="diplay-seq">1</meta>
<dc:contributor id="translator1">Alfred Weasley</dc:contributor>
<meta refines="translator1" property="role" scheme="marc:relators">trl</meta>
<meta refines="translator1" property="role" scheme="onix:codelist17">B06</meta>
<meta refines="translator1" property="file-as">Weasley, Alfred</meta>
<meta refines="translator1" property="diplay-seq">1</meta>
</package>
这里的顺序很重要。
我使用这个结构:
type Pack struct {
XMLName struct{} `xml:"package"`
People []PersonWrapper `xml:""` // <-- is this the problem?
}
type Person struct {
Id string `xml:"id,attr"`
Name string `xml:"-"`
Surname string `xml:"-"`
FullName string `xml:",innerxml"`
}
type Meta struct {
Refines string `xml:"refines,attr"`
Property string `xml:"property,attr"`
Scheme string `xml:"scheme,attr,omitempty"`
Value string `xml:",innerxml"`
}
type PersonWrapper struct {
Person Person `xml:"dc:contributor"`
Metas []Meta `xml:"meta"`
}
有了这个我得到了:
<package>
<People>
<dc:contributor id="creator1">John Doe</dc:contributor>
<meta refines="creator1" property="role" scheme="marc:relators">aut</meta>
<meta refines="creator1" property="role" scheme="onix:codelist17">A01</meta>
<meta refines="creator1" property="file-as">Doe, John</meta>
<meta refines="creator1" property="diplay-seq">1</meta>
</People>
<People>
<dc:contributor id="reviewer1">Mary Poppins</dc:contributor>
<meta refines="reviewer1" property="role" scheme="marc:relators">rev</meta>
<meta refines="reviewer1" property="file-as">Poppins, Mary</meta>
<meta refines="reviewer1" property="diplay-seq">1</meta>
</People>
<People>
<dc:contributor id="translator1">Ben Weasley</dc:contributor>
<meta refines="translator1" property="role" scheme="marc:relators">trl</meta>
<meta refines="translator1" property="role" scheme="onix:codelist17">B06</meta>
<meta refines="translator1" property="file-as">Weasley, Ben</meta>
<meta refines="translator1" property="diplay-seq">1</meta>
</People>
</package>
如何去除 <People/>
外标签?我试图将内部结构包装到更高级别的其他结构中,但无法达到所需的结构。
您可以为 PersonWrapper
实现 xml.Marshaler
接口(并将 xmlnames 添加到嵌套结构)。
type Pack struct {
XMLName struct{} `xml:"package"`
People []PersonWrapper
}
type Person struct {
XMLName xml.Name `xml:"dc:contributor"`
Id string `xml:"id,attr"`
Name string `xml:"-"`
Surname string `xml:"-"`
FullName string `xml:",innerxml"`
}
type Meta struct {
XMLName xml.Name `xml:"meta"`
Refines string `xml:"refines,attr"`
Property string `xml:"property,attr"`
Scheme string `xml:"scheme,attr,omitempty"`
Value string `xml:",innerxml"`
}
type PersonWrapper struct {
Person Person `xml:"dc:contributor"`
Metas []Meta `xml:"meta"`
}
func (pw PersonWrapper) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
if err := e.Encode(pw.Person); err != nil {
return err
}
if err := e.Encode(pw.Metas); err != nil {
return err
}
return nil
}