【问题标题】:Using powershell to edit multiple XML files使用 powershell 编辑多个 XML 文件
【发布时间】:2010-03-03 00:41:38
【问题描述】:

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

示例: 我想在第一个 <Names> 元素中添加 <LastName>SomeName</LastName>

<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>

【问题讨论】:

  • 是你唯一可以使用的工具吗?
  • 不,powershell 不是我可以使用的唯一工具。只是认为这将是最容易使用的。你能推荐其他的吗?

标签: powershell powershell-1.0


【解决方案1】:

您可以使用CreateElementAppendChild 方法来做到这一点

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(都找到第一个 Names 节点):

$node = (Select-Xml -Xml $x -XPath '//Names[1]').Node
$node = (Select-Xml -Xml $x -XPath '//Names[position()=1]').Node

【讨论】:

  • 呃,你真的应该去掉这个答案中提到正则表达式的那一行。在此之前,我们在 SO 上已经走这条路很多次了——在处理 XML 时,它不是一个选项。
  • 完成。同意你的观点,但对于某些用户来说,这可能是一种选择。我什至可以用&lt;/FirstName&gt;&lt;LastName&gt;SomeName&lt;/LastName&gt; 替换第一次出现的&lt;/FirstName&gt;,然后将其重新格式化为xml。 破解
  • 运行脚本时出现此错误:“在此对象上找不到属性 'InnerText';请确保它存在并且可设置。”会不会是我的 Powershell 版本?
  • 如果添加$lastName.GetType().FullName,返回什么?你也可以试试$lastName.PsBase.InnerText=..。 V1 中存在一些问题,尽管我认为建议的解决方案应该可以正常工作。
  • 太棒了。添加 PsBase 有效 :) 但它有什么作用?另外,我将如何删除添加到元素中的 xmlns 属性?添加 $lastName.GetType().FullName 会返回 System.Xml.XmlElement
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2015-08-04
  • 2011-08-28
  • 2014-09-12
  • 2014-01-15
相关资源
最近更新 更多