英文:
Create XML element without closing tag
问题
我有这个嵌套的 Golang 结构体:
// TierRequest 是 SOAP 请求的最外层 XML 包裹
type TierRequest struct {
XMLName xml.Name `xml:"soapenv:Envelope"`
NsEnv string `xml:"xmlns:soapenv,attr"`
NsType string `xml:"xmlns:typ,attr"`
Header string `xml:"soapenv:Header"`
}
// TierBody 是一个空容器,包含 GetCollectorProfile 结构体
type TierBody struct {
GetCollectorProfiles GetCollectorProfile `xml:"typ:GetCollectorProfileRequest"`
}
// GetCollectorProfile 结构体包含上下文和收集器编号
type GetCollectorProfile struct {
Contexts CollectorContext `xml:"typ:Context"`
Number int `xml:"typ:CollectorNumber"`
}
// CollectorContext 包含几个变量作为属性
type CollectorContext struct {
Channel string `xml:"Channel,attr"`
Source string `xml:"Source,attr"`
Language string `xml:"LanguageCode,attr"`
}
当我使用值进行初始化并使用 encoding/xml
进行编组时,它看起来像这样:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:typ="http:/www.yahoo.com/tp/ets/2008/04/01/collector/types">
<soapenv:Header></soapenv:Header>
<soapenv:Body>
<GetCollectorProfiles>
<typ:Context Channel="WEB" Source="WEB" LanguageCode="en-CA"></typ:Context>
<typ:CollectorNumber>50000</typ:CollectorNumber>
</GetCollectorProfiles>
</soapenv:Body>
</soapenv:Envelope>
我如何去掉 soapenv:Header
和 typ:Context
的闭合标签,使其只显示为 <soapenv:Header/>
?
英文:
I have this nested golang struct:
<!-- begin snippet: js hide: false -->
<!-- language: lang-go -->
// TierRequest is the outer most XML envelope of soap request
type TierRequest struct {
XMLName xml.Name `xml:"soapenv:Envelope"`
NsEnv string `xml:"xmlns:soapenv,attr"`
NsType string `xml:"xmlns:typ,attr"`
Header string `xml:"soapenv:Header"`
// TierBody is an emtpy container with the GetCollectorProfile struct
type TierBody struct {
GetCollectorProfiles GetCollectorProfile `Collectorxml:"typ:GetCollectorProfileRequest"`
}
// GetCollectorProfile struct has the context and collector number
type GetCollectorProfile struct {
Contexts CollectorContext `xml:"typ:Context"`
Number int `xml:"typ:CollectorNumber"`
}
// CollectorContext contanins a few variables as attributes
type CollectorContext struct {
Channel string `xml:"Channel,attr"`
Source string `xml:"Source,attr"`
Language string `xml:"LanguageCode,attr"`
}
<!-- end snippet -->
When I initialize it with values and marshal with encoding/xml
it comes to look like this:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:typ="http:/www.yahoo.com/tp/ets/2008/04/01/collector/types">
<soapenv:Header></soapenv:Header>
<soapenv:Body>
<GetCollectorProfiles>
<typ:Context Channel="WEB" Source="WEB" LanguageCode="en-CA"></typ:Context>
<typ:CollectorNumber>50000</typ:CollectorNumber>
</GetCollectorProfiles>
</soapenv:Body>
</soapenv:Envelope>
How I can get rid of the closing tags for soapenv:Header
and typ:Context
, so it just looks like <soapenv:Header/>
?
答案1
得分: 6
在XML级别上,没有内容的元素和带有end-tag的元素之间没有区别:
<soapenv:Header></soapenv:Header>
和***empty element tag***:
<soapenv:Header/>
要控制使用哪种形式,您需要将数据视为文本而不是XML,但最好不要担心没有区别的差异。
[为了完整性而添加]
...除了一个晦涩而过时的建议
> 为了互操作性,应该使用空元素标签,并且只能用于声明为空的元素。
关于与SGML的互操作性:
> 为了互操作性
>
> [定义:标记一个句子,描述了一个非约束性的建议,旨在增加XML文档能够被现有的在WebSGML Adaptations Annex to ISO 8879之前就存在的SGML处理器处理的机会。]
英文:
There is no difference at the XML level between an element with no content and an end-tag:
<soapenv:Header></soapenv:Header>
and an empty element tag:
<soapenv:Header/>
To control which form is used, you'd have to treat the data as text rather than as XML, but better not to worry about a difference that makes no difference.
[Added for completeness]
...other than an obscure and antiquated recommendation
> For interoperability, the empty-element tag should be used, and should
> only be used, for elements which are declared EMPTY.
regarding interoperability with SGML:
> for interoperability
>
> [Definition: Marks a sentence describing a non-binding recommendation
> included to increase the chances that XML documents can be processed
> by the existing installed base of SGML processors which predate the
> WebSGML Adaptations Annex to ISO 8879.]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论