对包含命名空间 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问答 | 4天前 | goroutine · HTTP · Context · 超时控制 · Go问答 · WithTimeout Go问答 context取消 QueryContext HTTP请求取消 goroutine退出
- Go HTTP 请求取消后任务会自动停吗:context 传递、超时和资源释放
- 120浏览 收藏
-
- Golang · Go问答 | 4天前 | sync.Pool · reset · 对象复用 · Go问答 · 线上排查 · Go sync.Pool Go问答 sync.Pool串数据 Reset清理 对象池复用
- Go sync.Pool 为什么会串数据:Reset 和 Put 的顺序怎么定
- 342浏览 收藏
-
- Golang · Go问答 | 5天前 | [] · []
- Go time.After 写在循环里会泄漏吗:定时器堆积、Stop 和 NewTimer 复用怎么判断
- 181浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 4464次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 4110次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 4098次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 4283次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 4256次使用
-
- 用Nginx反向代理部署go写的网站。
- 2023-01-17 502浏览
-
- GoLand调式动态执行代码
- 2023-01-13 502浏览
-
- 从不同的 go 例程将数据写入同一通道无需等待组即可正常工作
- 2024-04-29 501浏览
-
- Golang rsa-oaep解密失败,前端使用webcrypto
- 2024-04-26 501浏览
-
- 如何从用户输入以惰性方式初始化包的全局变量?
- 2024-04-24 501浏览

