需要在xml文件中编辑节点的属性值

时间:2019-03-25 09:58:38

标签: xml powershell

我正在尝试使用登录用户的ID在XML文件中编辑属性值

我尝试过:

$user = $env:USERNAME
$xml = [xml](Get-Content "D:\Python\prm.xml")
$node = $xml.BootStrap.DataBaseAliases.LastLoginUserName
$node.SetAttribute("LastLoginUserName", "$user");

它返回一个错误: 您不能在空值表达式上调用方法。 在D:\ Python \ a.ps1:5 char:1 + $ node.SetAttribute(“ LastLoginUserName”,“ $ user”); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     + CategoryInfo:InvalidOperation:(:) [],RuntimeException     + FullyQualifiedErrorId:InvokeMethodOnNull

还尝试了以下操作:

$user = $env:USERNAME
$FileLocation = "D:\Python\prm.xml"
$File = Get-Content $FileLocation
$XML = [XML]$File
$XPpath = "/BootStrap/DataBaseAliases/LastLoginUserName"
$node = $XML.SelectNodes($XPpath)
$node | % { $_.SetAttribute("attribute-1", "$user") }
$XML.OuterXml | Out-File $FileLocation

这不会返回任何错误,但是xml不变。 下面的XML内容:

<?xml version="1.0" encoding="utf-8"?><BootStrap MajorVersion="18" 
MinorVersion="8" PatchVersion="5" DeploymentVersion="0"><DataBaseAliases 
DefaultPMAlias="Corp_2016" LastLoginUserName="FOOUSER"><Alias>
<Name>PMDB</Name><AppType>Project Management</AppType><Connection> 
<DriverName>SQLServer</DriverName><BlobSize>-

我想用当前登录的用户替换FOOUSER。

1 个答案:

答案 0 :(得分:1)

XPath没有指向适当的元素,因此结果是一个空集。让我们看看为什么。

/BootStrap/DataBaseAliases/LastLoginUserName会匹配XML,

<BootStrap>
  <DatabaseAliases>
    <LastLoginUserName />
  </DatabaseAliases>
</BootStrap>

这不是示例中的内容。 LastLoginUserNameDatabaseAliases属性。更改XPath使其指向DataBaseAliases元素并设置其属性,如下所示:

$XPpath = "/BootStrap/DataBaseAliases"
$node = $XML.SelectNodes($XPpath)
$node | % { $_.SetAttribute("LastLoginUserName", $user) }
$XML.InnerXML