使用powershell编辑多个XML文件

发布于 2024-08-22 07:57:51 字数 784 浏览 10 评论 0原文

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

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

How can I get a list of multiple XML files from a specified directory and for each file add an element under the second root node using powershell?

Example:
I want to add <LastName>SomeName</LastName> within the FIRST <Names> element:

<People>
  <Names>
      <FirstName>someFirstName</FirstName>
  </Names>
  <Names>
      <FirstName>myFirstName</FirstName>
      <Address>SomeAddress</Address>
  </Names>
</People>

Will become:

<People>
  <Names>
      <LastName>SomeName</LastName>
      <FirstName>someFirstName</FirstName>
  </Names>
  <Names>
      <FirstName>myFirstName</FirstName>
      <Address>SomeAddress</Address>
  </Names>
</People>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

分分钟 2024-08-29 07:57:51

您可以使用 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

You can do it using CreateElement and AppendChild method

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

In case that you run PowerShell V2, you don't need to use property PsBase:

        $lastName.InnerText = 'SomeName'

There are for sure other ways, but this is one is quite easy.


In case that the node would be deeper in xml, you might use Xpath like this (both find first Names node):

$node = (Select-Xml -Xml $x -XPath '//Names[1]').Node
$node = (Select-Xml -Xml $x -XPath '//Names[position()=1]').Node
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文