使用powershell编辑多个XML文件

使用powershell编辑多个XML文件,powershell,powershell-1.0,Powershell,Powershell 1.0,如何从指定目录获取多个XML文件的列表,并使用powershell为每个文件在第二个根节点下添加一个元素 例如: 我想在第一个元素中添加SomeName: <People> <Names> <FirstName>someFirstName</FirstName> </Names> <Names> <FirstName>myFirstName</FirstName>

如何从指定目录获取多个XML文件的列表,并使用powershell为每个文件在第二个根节点下添加一个元素

例如: 我想在第一个
元素中添加
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