对包含命名空间 xmlns:wcm 和 xmlns:xsi 的 XML 进行正确编组和解组
来源:stackoverflow
时间:2024-02-05 21:25:10 130浏览 收藏
今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《对包含命名空间 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学习网公众号!
-
502 收藏
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
139 收藏
-
204 收藏
-
325 收藏
-
477 收藏
-
486 收藏
-
439 收藏
-
357 收藏
-
352 收藏
-
101 收藏
-
440 收藏
-
212 收藏
-
143 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习