试图用powershell更新xml文档,但在更新根节点时出现问题。

问题描述 投票:0回答:1

文档示例。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Identity PUBLIC "point.dtd" "point.dtd"[]>
<Identity  created="1525465321820" name="Onboarding - GUI - External">
  <Attributes>
    <Map>
      <entry key="displayName" value="Onboarding - GUI " />
      <entry key="firstname" value="Z Orphaned ID" />
  </Attributes>
</Identity>

我可以像这样给displayName和firstname赋值,没有问题。

[string] $displayvalue = $xmldata.Identity.Attributes.Map.entry[0].value

[string] $firstname = $xmldata.Identity.Attributes.Map.entry[1].value

然后保存。

$myFile = 'C:\somefile.xml'
$xmldata.Save($myFile)

但是,当我试图为name做同样的事情时。

[string]  $xmldata.Identity.Name = "TEST"

我得到一个错误。

在这个对象上找不到属性'Name'。验证该属性是否存在并可以设置。

谅谅

powershell xml-parsing
1个回答
0
投票

你是 殊途同归 name 属性,就像你对 displaynamefirstname 属性。对于后两者,你是 阅读 将XML中的值放入字符串变量中。有了 name 属性,你是想 设置 为一个新的值。

要做到这一点,你首先需要选择持有要更新的属性的元素。一旦选择了这个元素,你就可以使用 SetAttribute() 方法的XmlElement对象。

[xml]$xmldata = @"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Identity PUBLIC "point.dtd" "point.dtd"[]>
<Identity  created="1525465321820" name="Onboarding - GUI - External">
  <Attributes>
    <Map>
      <entry key="displayName" value="Onboarding - GUI " />
      <entry key="firstname" value="Z Orphaned ID" />
    </Map>
  </Attributes>
</Identity>
"@

# select the node(s) to update, and update the name attribute
$xmldata.Identity | Where-Object { $_.name -like 'Onboarding*' } | ForEach-Object {
    $_.SetAttribute("name", "TEST")
}

# Now save the updated XM to file:
$xmldata.Save('C:\somefile.xml')

输出。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Identity PUBLIC "point.dtd" "point.dtd"[]>
<Identity created="1525465321820" name="TEST">
  <Attributes>
    <Map>
      <entry key="displayName" value="Onboarding - GUI " />
      <entry key="firstname" value="Z Orphaned ID" />
    </Map>
  </Attributes>
</Identity>

1
投票

XMLs是区分大小写的,而且因为在

<Identity  created="1525465321820" name="Onboarding - GUI - External">

"name "是小写的,你需要用

$xmldata.Identity.name

相对于

$xmldata.Identity.Name

并编辑该值,使用

$xmldata.Identity.name = "TEST"

测试

PS C:\Users\Neko> [xml]$xmldata = @'
>> <Identity  created="1525465321820" name="Onboarding - GUI - External">
>>   <Attributes>
>>     <Map>
>>       <entry key="displayName" value="Onboarding - GUI " />
>>       <entry key="firstname" value="Z Orphaned ID" />
>>     </Map>
>> </Attributes>
>> </Identity>
>> '@
PS C:\Users\Neko> $xmldata.Identity.name
Onboarding - GUI - External
PS C:\Users\Neko> $xmldata.Identity.name = "TEST"
PS C:\Users\Neko> $xmldata.Identity.name
TEST

如果你想导入一个xml文件,请按以下步骤进行。

  1. 设置一个变量作为xml文件的内容,但跳过前两行,设置另一个变量作为前两行。
[xml]$var = Get-Content .\test.xml | select-object -skip 2
$var2 = Get-Content .\test.xml | select-object -first 2
  1. 使用 $var 如上所述
$var.Identity.name

输出:

Onboarding - GUI - External

输入:

$var.Identity.name = "TEST"
$var.Identity.name

Output: Output:

TEST
  1. 然后把头加回变量
[xml]$final = $var2 + $var.outerxml
  1. 最后,将变量保存回XML文件中。
$final.Save("filepath")

一些关于

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Identity PUBLIC "point.dtd" "point.dtd"[]>

Powershell似乎不喜欢,因此,如果你跳过它们,就能正常工作......

在Powershell 5.1中测试


稍微 改了你的XML文件,因为当我使用你的XML时,PS给我出了错误,因为没有关闭 </map>

© www.soinside.com 2019 - 2024. All rights reserved.