对包含命名空间 xmlns:wcm 和 xmlns:xsi 的 XML 进行正确编组和解组
今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《对包含命名空间 xmlns:wcm 和 xmlns:xsi 的 XML 进行正确编组和解组》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!
我正在尝试处理 windows autounattend.xml 文件的读取和写入,以便创建和修改它们。我无法正确封送和解封 xmlns:wcm
和 xmlns:xsi
属性。
en-us 0409:00000409 en-us en-us en-us en-us 0 true 1 primary 300 2 efi 100 3 msr 128 4 primary true 1 1 ntfs de94bba4-06d1-4d40-a16a-bfd50179d6ac 2 2 fat32 3 3 4 4 c ntfs 0 4 false never true admin false 1 0409:00000409 en-us en-us en-us en-us true 0 -pc true true admin true true true true home true true 1 true admin administrators admin admin false control panel view 1 reg add "hkey_current_user\software\microsoft\windows\currentversion\explorer\controlpanel" /v startuppage /t reg_dword /d 1 /f true 2 control panel icon size false reg add "hkey_current_user\software\microsoft\windows\currentversion\explorer\controlpanel" /v allitemsiconview /t reg_dword /d 0 /f 3 false cmd /c wmic useraccount where name="admin" set passwordexpires=false password never expires central standard time
我尝试使用 xml.name
、xml.attr
和字符串,但没有成功
const ( // A generic XML header suitable for use with the output of Marshal. Header = `` + "\n" WCM = `http://schemas.microsoft.com/WMIConfig/2002/State` XSI = `http://www.w3.org/2001/XMLSchema-instance` ) type UserData struct { AcceptEula bool `xml:"AcceptEula"` FullName string `xml:"FullName"` Organization string `xml:"Organization"` ProductKey struct { Key string `xml:"Key"` WillShowUI string `xml:"WillShowUI"` } `xml:"ProductKey"` } type OSImage struct { XMLName xml.Name `xml:"OSImage"` InstallToAvailablePartition bool `xml:"InstallToAvailablePartition"` InstallToDiskID uint32 `xml:"InstallTo>DiskID"` InstallToPatitionID uint32 `xml:"InstallTo>ParitionID"` } type ImageInstall struct { XMLName xml.Name `xml:"ImageInstall"` OSImage OSImage `xml:"OSImage"` } type CreatePartition struct { XMLName xml.Name `xml:"CreatePartition"` Order uint32 `xml:"Order"` Type string `xml:"Type"` Size uint64 `xml:"Size,omitempty"` Extend bool `xml:"Extend,omitempty"` Action xml.Attr `xml:"action,attr"` } type ModifyPartition struct { XMLName xml.Name `xml:"ModifyPartition"` Order uint32 `xml:"Order"` PartitionID uint32 `xml:"PartitionID"` Label string `xml:"Label,omitempty"` Format string `xml:"Format,omitempty"` TypeID string `xml:"TypeID,omitempty"` Letter string `xml:"Letter,omitempty"` Action xml.Attr `xml:"action,attr"` } type Disk struct { XMLName xml.Name `xml:"Disk"` Action xml.Attr `xml:"action,attr"` DiskID uint32 `xml:"DiskID"` WillWipeDisk bool `xml:"WillWipeDisk"` CreatePartitions []*CreatePartition `xml:"CreatePartitions>."` ModifyPartitions []*ModifyPartition `xml:"ModifyPartitions>."` } type DiskConfiguration struct { XMLName xml.Name `xml:"DiskConfiguration"` Disks []*Disk `xml:"Disk"` } type SetupUILanguage struct { XMLName xml.Name `xml:"SetupUILanguage"` UILanguage *UILanguage `xml:"UILanguage"` } type UserLocale struct { XMLName xml.Name `xml:"UserLocale"` Value string `xml:",chardata"` } type InputLocale struct { XMLName xml.Name `xml:"InputLocale"` Value string `xml:",chardata"` } type SystemLocale struct { XMLName xml.Name `xml:"SystemLocale"` Value string `xml:",chardata"` } type UILanguage struct { XMLName xml.Name `xml:"UILanguage"` Value string `xml:",chardata"` } type UILanguageFallback struct { XMLName xml.Name `xml:"UILanguageFallback"` Value string `xml:",chardata"` } type EnableLUA struct { XMLName xml.Name `xml:"EnableLUA"` Value bool `xml:",chardata"` } type SkipRearm struct { XMLName xml.Name `xml:"SkipRearm"` Value int32 `xml:",chardata"` } type SkipAutoActivation struct { XMLName xml.Name `xml:"SkipAutoActivation"` Value bool `xml:",chardata"` } type CEIPEnabled struct { XMLName xml.Name `xml:"CEIPEnabled"` Value int32 `xml:",chardata"` } type ComputerName struct { XMLName xml.Name `xml:"ComputerName"` Value string `xml:",chardata"` } type ProductKey struct { XMLName xml.Name `xml:"ProductKey"` Value string `xml:",chardata"` } type Password struct { XMLName xml.Name `xml:"Password"` Value string `xml:"Value"` PlainText bool `xml:"PlainText"` } type AutoLogon struct { XMLName xml.Name `xml:"AutoLogon"` Enabled bool `xml:"Enabled"` Username string `xml:"Username"` Password Password `xml:"Password"` } type OOBE struct { XMLName xml.Name `xml:"OOBE"` HideEULAPage bool `xml:"HideEULAPage,omitempty"` HideOEMRegistrationScreen bool `xml:"HideOEMRegistrationScreen,omitempty"` HideOnlineAccountScreens bool `xml:"HideOnlineAccountScreens,omitempty"` HideWirelessSetupInOOBE bool `xml:"HideWirelessSetupInOOBE,omitempty"` NetworkLocation string `xml:"NetworkLocation,omitempty"` SkipUserOOBE bool `xml:"SkipUserOOBE,omitempty"` SkipMachineOOBE bool `xml:"SkipMachineOOBE,omitempty"` ProtectYourPC int32 `xml:"ProtectYourPC,omitempty"` } type LocalAccount struct { XMLName xml.Name `xml:"LocalAccount"` Action xml.Attr `xml:"action,attr"` Password Password `xml:"Password"` Description string `xml:"Description"` DisplayName string `xml:"DisplayName"` Group string `xml:"Group"` Name string `xml:"Name"` } type LocalAccounts struct { XMLName xml.Name LocalAccount []*LocalAccount `xml:"LocalAccount"` } type UserAccounts struct { XMLName xml.Name `xml:"UserAccounts"` LocalAccounts LocalAccounts `xml:"LocalAccounts"` } type RegisteredOrganization struct { XMLName xml.Name `xml:"RegisteredOrganization"` Value string `xml:",chardata"` } type RegisteredOwner struct { XMLName xml.Name `xml:"RegisteredOwner"` Value string `xml:",chardata"` } type DisableAutoDaylightTimeSet struct { XMLName xml.Name `xml:"DisableAutoDaylightTimeSet"` Value bool `xml:",chardata"` } type CommandLine struct { XMLName xml.Name `xml:"CommandLine"` Value string `xml:",innerxml"` } type SynchronousCommand struct { XMLName xml.Name `xml:"SynchronousCommand"` Order uint32 `xml:"Order"` Description string `xml:"Description"` RequiresUserInput bool `xml:"RequiresUserInput"` CommandLine CommandLine `xml:"CommandLine"` } type FirstLogonCommands struct { XMLName xml.Name `xml:"FirstLogonCommands"` SynchronousCommand []*SynchronousCommand `xml:"SynchronousCommand"` } type TimeZone struct { XMLName xml.Name `xml:"TimeZone"` Value string `xml:",chardata"` } type Component struct { XMLName xml.Name `xml:"component"` Name string `xml:"name,attr"` ProcessorArchitecture string `xml:"processorArchitecture,attr"` PublicKeyToken string `xml:"publicKeyToken,attr"` Language string `xml:"language,attr"` VersionScope string `xml:"versionScope,attr"` // optional compontents SetupUILanguage *SetupUILanguage `xml:"SetupUILanguage"` UserLocale *UserLocale `xml:"UserLocale"` InputLocale *InputLocale `xml:"InputLocale"` SystemLocale *SystemLocale `xml:"SystemLocale"` UILanguage *UILanguage `xml:"UILanguage"` UILanguageFallback *UILanguageFallback `xml:"UILanguageFallback"` DiskConfiguration *DiskConfiguration `xml:"DiskConfiguration,omitempty"` ImageInstall *ImageInstall `xml:"ImageInstall,omitempty"` UserData *UserData `xml:"UserData,omitempty"` EnableLUA *EnableLUA `xml:"EnableLUA,omitempty"` SkipRearm *SkipRearm `xml:"SkipRearm,omitempty"` ProductKey *ProductKey `xml:"ProductKey,omitempty"` ComputerName *ComputerName `xml:"ComputerName,omitempty"` SkipAutoActivation *SkipAutoActivation `xml:"SkipAutoActivation,omitempty"` CEIPEnabled *CEIPEnabled `xml:"CEIPEnabled,omitempty"` AutoLogon *AutoLogon `xml:"AutoLogon,omitempty"` OOBE *OOBE `xml:"OOBE,omitempty"` UserAccounts *UserAccounts `xml:"UserAccounts"` RegisteredOrganization *RegisteredOrganization `xml:"RegisteredOrganization,omitempty"` RegisteredOwner *RegisteredOwner `xml:"RegisteredOwner,omitempty"` DisableAutoDaylightTimeSet *DisableAutoDaylightTimeSet `xml:"DisableAutoDaylightTimeSet,omitempty"` FirstLogonCommands *FirstLogonCommands `xml:"FirstLogonCommands,omitempty"` TimeZone *TimeZone `xml:"TimeZone,omitempty"` } type Settings struct { XMLName xml.Name `xml:"settings"` Pass string `xml:"pass,attr"` Components []*Component `xml:"component"` } type Unattend struct { XMLName xml.Name `xml:"unattend"` XMLNS xml.Attr `xml:"xmlns,attr"` Settings []*Settings `xml:"settings"` }
正确答案
xmlns:wcm
和 xmlns:xsi
并不是真正的属性,它们是经过特殊处理的。您的 xml 既没有 wcm
和 xsi
架构中的元素也没有属性,因此它们将被删除。为什么你的代码中需要它们?
如果您确实需要它们,您可以将以下字段添加到 component
结构中:
attr []xml.attr `xml:",any,attr"`
xml.Unmarshal
documentation says:
如果 xml 元素具有先前规则未处理的属性,并且结构体具有包含“,any,attr”的关联标记的字段,则 unmarshal 会在第一个此类字段中记录该属性值。
这里是一个例子:https://go.dev/play/p/tGDh5Ay1kZW
func main() { var u unattend err := xml.unmarshal([]byte(document), &u) if err != nil { log.fatal(err) } for _, a := range u.settings[0].components[0].attr { fmt.printf("unmatched attributes: %s:%s = %s\n", a.name.space, a.name.local, a.value) } }
输出:
unmatched attributes: xmlns:wcm = http://schemas.microsoft.com/wmiconfig/2002/state unmatched attributes: xmlns:xsi = http://www.w3.org/2001/xmlschema-instance
注意 1。此解决方案的缺点是:它仅处理
中的额外属性。但 xmlns:xxx
属性可以出现在任何元素中。一般情况下,您应该在数据模型的所有结构中添加 attr
数组。
注2.属性xmlns:wcm
和xmlns:xsi
不包含任何业务逻辑。他们没有提供有关设置和组件的信息。你真的需要它们吗?
注释 3. 绝对不需要将这些属性命名为 xmlns:wcm
和 xmlns:xsi
。这只是一种常见的做法。 xml 文档可以将它们命名为 xmlns:foo
和 xmlns:bar
- 这是完全有效的。即使值 "http://schemas.microsoft.com/wmiconfig/2002/state"
和 "http://www.w3.org/2001/xmlschema-instance"
也没有任何意义。它们可以是任何字符串,唯一的要求是匹配 URI format。 urn:microsoft:wmi-config:2002:state
与 http://schemas.microsoft.com/wmiconfig/2002/state
一样有效
解析 component
中的这些属性非常具体,对于在其他元素中或使用其他后缀或值声明这些属性的其他有效 xml 文档可能会失败。
更新
编组工作未按预期进行。 xml.marshal
专门处理 xmlns
命名空间,并将 attr
的 xmlns:wcm
和 xmlns:xsi
转换为命名空间 _xmlns
...
解决方法是对属性使用特殊类型:
type xmlnsattr struct { name xml.name value string } func (a xmlnsattr) label() string { if a.name.space == "" { return a.name.local } if a.name.local == "" { return a.name.space } return a.name.space + ":" + a.name.local } func (a *xmlnsattr) unmarshalxmlattr(attr xml.attr) error { a.name = attr.name a.value = attr.value return nil } func (a xmlnsattr) marshalxmlattr(name xml.name) (xml.attr, error) { return xml.attr{ name: xml.name{ space: "", local: a.label(), }, value: a.value, }, nil }
此类型通过构造一个属性并将命名空间嵌入到本地名称中来实现这一点。领域
attr []xml.attr `xml:",any,attr"`
正确解码/编码 xmlns:xxx
属性
示例:https://go.dev/play/p/VDofREl5nf1
输出:
Unmatched attributes: xmlns:wcm = http://schemas.microsoft.com/WMIConfig/2002/State Unmatched attributes: xmlns:xsi = http://www.w3.org/2001/XMLSchema-instance... ...
以上就是《对包含命名空间 xmlns:wcm 和 xmlns:xsi 的 XML 进行正确编组和解组》的详细内容,更多关于的资料请关注golang学习网公众号!

- 上一篇
- 时间范围内数组元素的标准化方法

- 下一篇
- 为什么在 Goland (IDEA) 中 Go 源代码显示为灰色?如何恢复正常显示?
-
- Golang · Go问答 | 1年前 |
- 在读取缓冲通道中的内容之前退出
- 139浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 戈兰岛的全球 GOPRIVATE 设置
- 204浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 如何将结构作为参数传递给 xml-rpc
- 325浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 如何用golang获得小数点以下两位长度?
- 477浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 如何通过 client-go 和 golang 检索 Kubernetes 指标
- 486浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 将多个“参数”映射到单个可变参数的习惯用法
- 439浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 将 HTTP 响应正文写入文件后出现 EOF 错误
- 357浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 结构中映射的匿名列表的“复合文字中缺少类型”
- 352浏览 收藏
-
- Golang · Go问答 | 1年前 |
- NATS Jetstream 的性能
- 101浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 如何将复杂的字符串输入转换为mapstring?
- 440浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 相当于GoLang中Java将Object作为方法参数传递
- 212浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 如何确保所有 goroutine 在没有 time.Sleep 的情况下终止?
- 143浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 毕业宝AIGC检测
- 毕业宝AIGC检测是“毕业宝”平台的AI生成内容检测工具,专为学术场景设计,帮助用户初步判断文本的原创性和AI参与度。通过与知网、维普数据库联动,提供全面检测结果,适用于学生、研究者、教育工作者及内容创作者。
- 12次使用
-
- AI Make Song
- AI Make Song是一款革命性的AI音乐生成平台,提供文本和歌词转音乐的双模式输入,支持多语言及商业友好版权体系。无论你是音乐爱好者、内容创作者还是广告从业者,都能在这里实现“用文字创造音乐”的梦想。平台已生成超百万首原创音乐,覆盖全球20个国家,用户满意度高达95%。
- 26次使用
-
- SongGenerator
- 探索SongGenerator.io,零门槛、全免费的AI音乐生成器。无需注册,通过简单文本输入即可生成多风格音乐,适用于内容创作者、音乐爱好者和教育工作者。日均生成量超10万次,全球50国家用户信赖。
- 22次使用
-
- BeArt AI换脸
- 探索BeArt AI换脸工具,免费在线使用,无需下载软件,即可对照片、视频和GIF进行高质量换脸。体验快速、流畅、无水印的换脸效果,适用于娱乐创作、影视制作、广告营销等多种场景。
- 26次使用
-
- 协启动
- SEO摘要协启动(XieQiDong Chatbot)是由深圳协启动传媒有限公司运营的AI智能服务平台,提供多模型支持的对话服务、文档处理和图像生成工具,旨在提升用户内容创作与信息处理效率。平台支持订阅制付费,适合个人及企业用户,满足日常聊天、文案生成、学习辅助等需求。
- 27次使用
-
- GoLand调式动态执行代码
- 2023-01-13 502浏览
-
- 用Nginx反向代理部署go写的网站。
- 2023-01-17 502浏览
-
- Golang取得代码运行时间的问题
- 2023-02-24 501浏览
-
- 请问 go 代码如何实现在代码改动后不需要Ctrl+c,然后重新 go run *.go 文件?
- 2023-01-08 501浏览
-
- 如何从同一个 io.Reader 读取多次
- 2023-04-11 501浏览