Мой первоначальный подход заключался в том, чтобы найти схему XML
для файла XML
, созданного Export-Clixml
, в надежде, что схема поддерживает какой-то общий строковый элемент.Однако мне не удалось найти схему.
Решением было использование аргумента -first
командлета 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">
(и игнорировать мой пользовательский элемент)
Затем я сновапрочитайте файл XML, используя XMLReader
, чтобы получить мой пользовательский элемент
Редактировать 1
Изменен подход согласно предложению Йероена Мостерта
Примечания:
$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>