从哈希表输入生成xml输出



我想执行一个字符串形式,并将结果作为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包含您的字符串。使用$falseUTF8编码可防止在使用Windows PowerShell时添加BOM。它在PowerShell Core中不是必需的。当BOM存在时,字节流转换为字符串具有不可读的字符。

最新更新