【问题标题】:Foreach loop to add element to XMLForeach 循环将元素添加到 XML
【发布时间】:2021-05-14 16:29:28
【问题描述】:

我需要向 XML 中的现有节点添加一个新元素。目前的结构基本上是这样的:

<CommandManagerResults>
   <ListReports>
    <Row>
      <Name>aaa</Name>
    </Row>
    <Row>
      <Name>bbb</Name>
    </Row>
   </ListReports>
   <ListDocuments>
    <Row>
      <Name>ccc</Name>
    </Row>
    <Row>
      <Name>ddd</Name>
    </Row>
   </ListDocuments>
</CommandManagerResults>

我需要在所有“行”节点中添加一个元素。我到目前为止的代码:

$directory = "E:\temp"
cd $directory

[xml]$XmlDocument = Get-Content ".\test.xml"

$ProjectName = $XmlDocument.CreateElement("ProjectName")
$ProjectName.InnerText = "test"

$temp = $XmlDocument.SelectNodes("//Row")

foreach ($row in $temp){
    $row.AppendChild($ProjectName)
    $XmlDocument.Save($directory + '\test.xml')
}

但是,只有最后一个“行”节点与新的“项目名称”元素一起保存。我添加了'$row | FL' 在 foreach 循环中,它显示每个 Row 在循环的每次迭代中都存在 ProjectName 元素,不幸的是,无论我是在 foreach 循环内部还是在 foreach 循环之后保存,只有最后一个 Row 节点与 ProjectName 元素一起保存。结果如何:

<CommandManagerResults>
   <ListReports>
    <Row>
      <Name>aaa</Name>
    </Row>
    <Row>
      <Name>bbb</Name>
    </Row>
   </ListReports>
   <ListDocuments>
    <Row>
      <Name>ccc</Name>
    </Row>
    <Row>
      <Name>ddd</Name>
      <ProjectName>Test</ProjectName>
    </Row>
   </ListDocuments>
</CommandManagerResults>

我希望结构最终看起来像什么:

<CommandManagerResults>
   <ListReports>
    <Row>
      <Name>aaa</Name>
      <ProjectName>Test</ProjectName>
    </Row>
    <Row>
      <Name>bbb</Name>
      <ProjectName>Test</ProjectName>
    </Row>
   </ListReports>
   <ListDocuments>
    <Row>
      <Name>ccc</Name>
      <ProjectName>Test</ProjectName>
    </Row>
    <Row>
      <Name>ddd</Name>
      <ProjectName>Test</ProjectName>
    </Row>
   </ListDocuments>
</CommandManagerResults>

仅供参考,对 Powershell 和 XML 来说非常陌生,所以希望我所说的一切都有意义,并且至少我正朝着正确的方向前进。

【问题讨论】:

  • 为此最好使用 XSLT

标签: xml powershell foreach


【解决方案1】:

您必须为要添加的每个元素创建一个新元素。最后,Save() 调用应该只在最后,当您完成文档时。

$temp = $XmlDocument.SelectNodes("//Row")

foreach ($row in $temp){

    $ProjectName = $XmlDocument.CreateElement("ProjectName")
    $ProjectName.InnerText = "test"

    $row.AppendChild($ProjectName)
}

$XmlDocument.Save($directory + '\test.xml')

在旁注[xml]$XmlDocument = Get-Content ".\test.xml",虽然很方便,但却是不好的做法。它的工作是偶然的,因为现在大多数 XML 文档都是 UTF-8 编码的,这恰好是 Get-Content 使用的默认编码。但是Get-Content 对 XML“编码”属性的实际值一无所知。

加载 XML 文档的正确方法,同时尊重其“编码”属性:

$xml = [xml]::new()
$xml.Load((Convert-Path ".\test.xml")) 

【讨论】:

  • 非常感谢!我一直在努力解决这个问题太久了,很高兴这很简单。再次感谢!!!
  • @p0ck3tace 干杯!
  • 刚刚也更新了 XML 的加载,感谢指点。
猜你喜欢
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2020-05-30
  • 2019-08-02
相关资源
最近更新 更多