使用powershell编辑多个XML文件
如何从指定目录获取多个XML文件的列表,并使用powershell为每个文件在第二个根节点下添加一个元素 例如: 我想在第一个使用powershell编辑多个XML文件,powershell,powershell-1.0,Powershell,Powershell 1.0,如何从指定目录获取多个XML文件的列表,并使用powershell为每个文件在第二个根节点下添加一个元素 例如: 我想在第一个元素中添加SomeName: <People> <Names> <FirstName>someFirstName</FirstName> </Names> <Names> <FirstName>myFirstName</FirstName>
元素中添加SomeName
:
<People>
<Names>
<FirstName>someFirstName</FirstName>
</Names>
<Names>
<FirstName>myFirstName</FirstName>
<Address>SomeAddress</Address>
</Names>
</People>
名字
我的名字
某个地址
将成为:
<People>
<Names>
<LastName>SomeName</LastName>
<FirstName>someFirstName</FirstName>
</Names>
<Names>
<FirstName>myFirstName</FirstName>
<Address>SomeAddress</Address>
</Names>
</People>
名字
名字
我的名字
某个地址
您可以使用CreateElement
和AppendChild
方法来完成
Get-ChildItem c:\temp\ *.xml |
% {
$xml = [xml](Get-Content $_.fullname)
$lastName = $xml.CreateElement('LastName')
$lastName.PsBase.InnerText = 'SomeName'
$null = $xml.People.Names[0].AppendChild($lastName)
$xml.Save($_.FullName)
}
在运行PowerShell V2的情况下,不需要使用属性PsBase
:
$lastName.InnerText = 'SomeName'
当然还有其他的方法,但这是一种非常简单的方法
如果节点在xml中的深度更深,您可以像这样使用Xpath(两者都是先查找
名称
节点):
powershell是您唯一可以使用的工具吗?不,powershell不是我唯一可以使用的工具。我只是觉得这是最容易使用的。你能推荐点别的吗?呃,你真的应该去掉这句话中提到的正则表达式。在此之前,我们已经经历了很多TMIE,所以在处理XML.Done时,这不是一个选项。同意您的意见,但对于某些用户来说,这可能是一种选择。我甚至可以将第一次出现的
替换为SomeName
,然后将其重新格式化为xml。HackI在运行脚本时遇到此错误:“在该对象上找不到属性‘InnerText’;请确保它存在且可设置。”这可能是我的Powershell版本吗?如果添加$lastName.GetType().FullName
,它将返回什么?您也可以尝试$lastName.PsBase.InnerText=..
。V1中存在一些问题,尽管我认为提议的解决方案应该可以很好地工作。添加PsBase成功:)但是它做什么呢?另外,如何删除添加到元素中的xmlns属性?添加$lastName.GetType().FullName将返回System.Xml.XmlElement
$node = (Select-Xml -Xml $x -XPath '//Names[1]').Node
$node = (Select-Xml -Xml $x -XPath '//Names[position()=1]').Node