我正在使用Get-Credentials
获取Xen Pool主服务器的凭据。我正在使用XML
将凭据保存到Export-Clixml
文件中。我想向XML
创建的Export-Clixml
文件中添加一个元素,以将Xen池名称和Xen池主URL存储到XML
文件中。
问题:我使用Export-Clixml创建凭据XML
文件,然后修改XML
文件以添加额外的元素。但是,当我使用XML
读取Import-Clixml
文件时,会引发错误:Import-Clixml : Obj XML tag is not recognized.
如何使Import-Clixml
读取我的自定义凭据XML文件以获取凭据,而不会由于我的自定义对象而引发错误?
答案 0 :(得分:1)
我最初的方法是为XML
生成的XML
文件找到Export-Clixml
模式,希望该模式支持某种通用字符串元素。但是,我无法找到架构。
解决方案是使用-first
cmdlet的Import-Clixml
参数。
首先,我使用XML
创建了一个Export-Clixml
文件,然后添加了第二个Obj
元素(<Obj RefId="99" xmlns="">
)
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
<Obj RefId="0">
<TN RefId="0">
<T>System.Management.Automation.PSCredential</T>
<T>System.Object</T>
</TN>
<ToString>System.Management.Automation.PSCredential</ToString>
<Props>
<S N="UserName">UUUUU</S>
<SS N="Password">PPPP...PPPPP</SS>
</Props>
</Obj>
<Obj RefId="99" xmlns="">
<my-element-name my-element-attribute="AAAAA">EEEEEE</my-element-name>
</Obj>
</Objs>
要获取凭据,我像这样读取XML
:
$creds = $Import-Clixml -first 1 -path <fq path to xml file>
-first 1
强制Import-Clixml
仅读取<Obj RefId="0">
元素(并忽略我的自定义元素)
然后,我使用XMLReader
重新读取XML文件以获得我的自定义元素
编辑1
根据Jeroen Mostert的建议更改了方法
注意:
$ExportXmlFile.FileName
来自system.windows.forms.savefiledialog
$cred
加载了get-credentials的输出
$cred | Export-Clixml -Path $ExportXmlFile.FileName -Force
$xml = [xml] (type $ExportXmlFile.FileName)
[System.Xml.XmlElement]$root = $xml.DocumentElement
[System.Xml.XmlComment]$c = $xml.CreateComment(("poolName="+$textBoxXenPoolName.Text + "," + "poolMasterUrl="+$textBoxXenPoolMasterUrl.Text))
$xml.InsertBefore($c, $root);
$xml.Save($ExportXmlFile.FileName)
生成一个带有“结构化”注释的xml文件,我可以阅读和解析该文件:
<!--poolName=nnnnn,poolMasterUrl=https://###.##.#.#-->
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
<Obj RefId="0">
<TN RefId="0">
<T>System.Management.Automation.PSCredential</T>
<T>System.Object</T>
</TN>
<ToString>System.Management.Automation.PSCredential</ToString>
<Props>
<S N="UserName">uuu</S>
<SS N="Password">pppp...pppp</SS>
</Props>
</Obj>
</Objs>