XML 中特定节点的 SET 值
SET value for a particular node in XML
您好,我有一个 XML 文件,例如
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<ExternalLibPath>XYZ</ExternalLibPath>
<PropertyModelSDKPath>ABC</PropertyModelSDKPath>
</PropertyGroup>
<PropertyGroup Condition="xyz" == 'true'">
<DiagnosticConditionalDefines>FeatureA</DiagnosticConditionalDefines>
</PropertyGroup>
</Project>
我想使用 powershell 为 FeatureB 设置值。
我可以做这样的事情来获得价值
$xmlFile = [XML] (get-Content filename)
$xmlFile.Project.PropertyGroup.DiagnosticConditionalDefines
但是要写它,我需要做类似
的事情
$xmlFile.Project.PropertyGroup[2].DiagnosticConditionalDefines="FeatureB"
我不乐意在此处给出索引值“2”来写入此节点,因为它可能不会保持这种状态。
如何在此处不添加索引的情况下编辑值
我尝试了下面的代码,它对我有用。代码可能不是优化的,我是 powershell 的初学者
$xml = [xml](get-content "C:\temp.xml")
foreach($item in $xml.Project.PropertyGroup)
{
if($item.Condition -eq "'xyz' == 'true'")
{
$item.DiagnosticConditionalDefines = "FeatureDB"
}
}
$xml.Save($ProvisionFilePath)
根据对您的 XML 的更正,这是基于属性修改元素的几种 PowerShell-y 方法之一:
$xml = [xml](Get-Content $fileName)
$node = $xml.Project.PropertyGroup |
Where { $_.GetAttribute('Condition') -eq "'xyz' == 'true'"}
$node.DiagnosticConditionalDefines = 'new value'
您可以通过再次执行选择来确认它已经修改了原始 XML 结构,这次没有将其分配给变量:
$xml.Project.PropertyGroup | ? { $_.GetAttribute('Condition') -eq "'xyz' == 'true'"}
第二种验证方法是将更新的内容写回文件,然后检查文件:
$xml.Save($fileName)
我不得不这样做
$xmlFile = [xml] (Get-Content $file)
$value=[string] $xmlFile.Project.PropertyGroup.DiagnosticConditionalDefines
for( $i=0; $i -lt $xmlFile.Project.PropertyGroup.Count ; $i++)
{
if($xmlFile.Project.PropertyGroup[$i].DiagnosticConditionalDefines.Length -gt 0)
{
$xmlFile.Project.PropertyGroup[$i].DiagnosticConditionalDefines
$xmlFile.Project.PropertyGroup[$i].DiagnosticConditionalDefines += "TEST"
}
}
$xmlFile.Save($file.FullName)
您好,我有一个 XML 文件,例如
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<ExternalLibPath>XYZ</ExternalLibPath>
<PropertyModelSDKPath>ABC</PropertyModelSDKPath>
</PropertyGroup>
<PropertyGroup Condition="xyz" == 'true'">
<DiagnosticConditionalDefines>FeatureA</DiagnosticConditionalDefines>
</PropertyGroup>
</Project>
我想使用 powershell 为 FeatureB 设置值。
我可以做这样的事情来获得价值
$xmlFile = [XML] (get-Content filename)
$xmlFile.Project.PropertyGroup.DiagnosticConditionalDefines
但是要写它,我需要做类似
的事情$xmlFile.Project.PropertyGroup[2].DiagnosticConditionalDefines="FeatureB"
我不乐意在此处给出索引值“2”来写入此节点,因为它可能不会保持这种状态。
如何在此处不添加索引的情况下编辑值
我尝试了下面的代码,它对我有用。代码可能不是优化的,我是 powershell 的初学者
$xml = [xml](get-content "C:\temp.xml")
foreach($item in $xml.Project.PropertyGroup)
{
if($item.Condition -eq "'xyz' == 'true'")
{
$item.DiagnosticConditionalDefines = "FeatureDB"
}
}
$xml.Save($ProvisionFilePath)
根据对您的 XML 的更正,这是基于属性修改元素的几种 PowerShell-y 方法之一:
$xml = [xml](Get-Content $fileName)
$node = $xml.Project.PropertyGroup |
Where { $_.GetAttribute('Condition') -eq "'xyz' == 'true'"}
$node.DiagnosticConditionalDefines = 'new value'
您可以通过再次执行选择来确认它已经修改了原始 XML 结构,这次没有将其分配给变量:
$xml.Project.PropertyGroup | ? { $_.GetAttribute('Condition') -eq "'xyz' == 'true'"}
第二种验证方法是将更新的内容写回文件,然后检查文件:
$xml.Save($fileName)
我不得不这样做
$xmlFile = [xml] (Get-Content $file)
$value=[string] $xmlFile.Project.PropertyGroup.DiagnosticConditionalDefines
for( $i=0; $i -lt $xmlFile.Project.PropertyGroup.Count ; $i++)
{
if($xmlFile.Project.PropertyGroup[$i].DiagnosticConditionalDefines.Length -gt 0)
{
$xmlFile.Project.PropertyGroup[$i].DiagnosticConditionalDefines
$xmlFile.Project.PropertyGroup[$i].DiagnosticConditionalDefines += "TEST"
}
}
$xmlFile.Save($file.FullName)