我正在尝试创建一些XML,我正在使用XML命令创建目录结构。目录深度(如下所示)是可变的。
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles" />
<Directory Id="subdir1" Name="subdir1">
<Directory Id="subdir2" Name="subdir2">
<Directory Id="INSTALLDIR" Name="$(var.Directory)">
Powershell功能代码是这样的。我传入三个变量,$ Id,$ Name和一个INT $ i。 $ XMLNS在$ script:level。定义。
function WriteDirectory {
Param(
[Parameter(Mandatory = $true)][string]$Id,
[Parameter(Mandatory = $true)][string]$Name,
[Parameter(Mandatory = $true)][int]$NumDirectories
)
$Directories = $null
for ($i = 0; $i -lt $NumDirectories; $i++) {
$Directories += "Directory."
}
# Trim the trailing dot
[string]$Directories = $Directories.SubString(0,$Directories.Length-1)
$NewDirectory = $XML.CreateElement('Directory', $XMLNS)
$NewDirectory.SetAttribute('Id', $Id)
$NewDirectory.SetAttribute('Name', $Name)
$XML.Wix.Product.$Directories.AppendChild($NewDirectory) # This is the problem code
}
Powershell不喜欢字符串作为对象的一部分。 $ i可能高达7,所以最后一个命令基本上是,如果$ i是7:
$XML.Wix.Product.Directory.Directory.Directory.Directory.Directory.Directory.Directory.AppendChild($NewDirectory)
如何轻松形成最后一个基本上是动态的XML命令?
答案 0 :(得分:0)
我会使用递归函数。如果您有一个固定的深度,则可以通过每次递归调用递减$NumDirectories
:
function AppendDirectory {
Param(
[Parameter(Mandatory = $true)]$parentNode,
[Parameter(Mandatory = $true)][string]$Id,
[Parameter(Mandatory = $true)][string]$Name,
[Parameter(Mandatory = $true)][int]$NumDirectories
)
if ($NumDirectories -eq 0) {
$NewDirectory = $xml.CreateElement('Directory')
$NewDirectory.SetAttribute('Id', $Id)
$NewDirectory.SetAttribute('Name', $Name)
$parentNode.AppendChild($NewDirectory)
} else {
AppendDirectory $parentNode.Directory $Id $Name ($NumDirectories - 1)
}
}
AppendDirectory $XML.Wix.Product 'Id' 'Name' 5
或者,如果要在叶Directory
节点上追加新的Directory
节点而不考虑深度,可以执行以下操作:
function AppendDirectory {
Param(
[Parameter(Mandatory = $true)]$parentNode,
[Parameter(Mandatory = $true)][string]$Id,
[Parameter(Mandatory = $true)][string]$Name
)
if ($parentNode.ChildNodes.Count -eq 0) {
$NewDirectory = $xml.CreateElement('Directory')
$NewDirectory.SetAttribute('Id', $Id)
$NewDirectory.SetAttribute('Name', $Name)
$parentNode.AppendChild($NewDirectory)
} else {
AppendDirectory $parentNode.Directory $Id $Name
}
}
AppendDirectory $XML.Wix.Product 'Id' 'Name'