尝试使用powershell更新xml文档,但在更新根节点时出现问题
文档示例:尝试使用powershell更新xml文档,但在更新根节点时出现问题,powershell,xml-parsing,Powershell,Xml Parsing,文档示例: <?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="displ
<?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>
而不是存钱
$myFile = 'C:\somefile.xml'
$xmldata.Save($myFile)
但当我尝试对name做同样的事情时:
[string] $xmldata.Identity.Name = "TEST"
我有一个错误:
在此对象上找不到属性“Name”。验证该属性是否存在并可以设置
谢谢XML区分大小写,因为
<Identity created="1525465321820" name="Onboarding - GUI - External">
反对
$xmldata.Identity.Name
并使用
$xmldata.Identity.name = "TEST"
测试
按照上面演示的方法使用$var
输出:
Onboarding - GUI - External
TEST
<?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>
输入:
$var.Identity.name = "TEST"
$var.Identity.name
输出:
Onboarding - GUI - External
TEST
<?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>
然后将标题添加回变量
最后,将变量保存回XML文件
关于
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Identity PUBLIC "point.dtd" "point.dtd"[]>
Powershell似乎不喜欢,因此如果您跳过它们,它就可以正常工作
在Powershell 5.1中测试
稍微更改了您的XML文件,因为PS在我使用您的确切XML时给了我错误,因为没有关闭您对name属性的尝试与对displayname和firstname属性的尝试不同。
使用后两种方法,您将从XML中读取字符串变量中的值。使用name属性,您将尝试将其设置为新值
为此,首先需要选择保存要更新的属性的元素。一旦有了它,就可以使用XmlElement对象的SetAttribute方法
[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')
输出:
Onboarding - GUI - External
TEST
<?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>
错误与它看起来的完全一样,xml文件上没有name属性,除非$myfile文件中有不同的内容,请向我们提供有关thatHi Neko的信息,名称就在那里name=Onboard-GUI-External。从顶部算起的第三行。谢谢你的回复。哦,我的坏。。。它可能需要另一个命令才能访问,因为它位于属性内部。。。尝试$xmldata |让成员查看是否有用于属性的命令是否正确?没有关闭Thx Neko,有大量命令,抱歉,powershell还不太清楚。如何使用此..评论不用于扩展讨论;这段对话已经结束了。嗨,西奥,这太好了。我还有一个问题,我不知道name的name值是多少。如果我没有在$\ux.name下指定任何内容,就像我得到的方法调用失败一样,但它仍然会更改值。那应该没问题。我还有一个更大的问题。我要更改的文件最初是UNIX LF UTF-8,但当Powershell读写时,它们将所有mestup都放入带有空格的Windows CR LF UTF-8-BOM中,这些文件不好。你知道如何保持相同的格式吗?非常感谢您的帮助。@Evo我看到您已经发布了一个关于Unix格式与Windows的新问题。我回答了你贴在这里的问题。您可能不知道这一点,但通常会通过单击旁边的复选标记图标来接受解决问题的答案。
<?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>