文档示例。
<?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'。验证该属性是否存在并可以设置。
谅谅
你是 不 殊途同归 name
属性,就像你对 displayname
和 firstname
属性。对于后两者,你是 阅读 将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>
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文件,请按以下步骤进行。
[xml]$var = Get-Content .\test.xml | select-object -skip 2
$var2 = Get-Content .\test.xml | select-object -first 2
$var
如上所述$var.Identity.name
输出:
Onboarding - GUI - External
输入:
$var.Identity.name = "TEST"
$var.Identity.name
Output: Output:
TEST
[xml]$final = $var2 + $var.outerxml
$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>