我想执行一个字符串形式,并将结果作为XML变量。以下是我必须转换为有效xml的示例输入,
$ps_hash_table =@{
"Category01" = @(
'C1I1',
'C1I2',
'C1I3'
);
"Category02" = @(
'C2I1',
'C2I2',
'C2I3'
);
}
我需要这种格式的xml输出,
<Categories>
<list>C1I1</list>
<list>C1I2</list>
<list>C1I3</list>
<list>C2I1</list>
<list>C2I2</list>
<list>C2I3</list>
</Categories>
我能够在常规循环中将其格式化为xml字符串,但正在寻找最佳或更好的生成方法。
就我个人而言,我只需要使用一个[Xml.XmlWriter]
对象。
$xmlsettings = [xml.xmlwritersettings]::new()
$xmlsettings.indent = $true
$xmlsettings.omitxmldeclaration = $true
$xml = [xml.xmlwriter]::create('xml.xml',$xmlsettings)
$xml.writestartelement('Categories')
$ps_hash_table.values | Foreach-Object {
$_ | Foreach-Object {
$xml.writeelementstring('list',$_)
}
}
$xml.writeendelement()
$xml.flush()
$xml.close()
现在xml.xml
将包含您的xml格式字符串
要在不使用文件的情况下将XML字符串存储在变量中,可以使用MemoryStream
对象:
$xmlsettings = [xml.xmlwritersettings]::new()
$xmlsettings.indent = $true
$xmlsettings.omitxmldeclaration = $true
$xmlsettings.encoding = [text.encoding]::UTF8::new($false)
$stream = [io.memorystream]::new()
$xml = [xml.xmlwriter]::create($stream,$xmlsettings)
$xml.writestartelement('Categories')
$ps_hash_table.values | Foreach-Object {
$_ | Foreach-Object {
$xml.writeelementstring('list',$_)
}
}
$xml.writeendelement()
$xml.flush()
$xml.close()
$output = [text.encoding]::UTF8.GetString($stream.ToArray())
$stream.Dispose()
$stream.Close()
现在$output
包含您的字符串。使用$false
的UTF8
编码可防止在使用Windows PowerShell时添加BOM。它在PowerShell Core中不是必需的。当BOM存在时,字节流转换为字符串具有不可读的字符。