【问题标题】:Powershell script to set xml tag equal to another xml tag on the same linePowershell脚本将xml标记设置为同一行上的另一个xml标记
【发布时间】:2017-02-23 04:28:18
【问题描述】:

首先让我说我的 powershell 经验有限,很乐意接受其他应用程序来满足我的需要。

我有一个带有以下示例的 xml 文件:

<!-- ... -->
<anElement tag1="A" tag2="B" tag3="0.00" tag4="2.00" />
<anotherElement tag1="C" tag2="B" tag3="0.00" tag4="2.00" />
<somethingElse tag1="D" tag2="B" tag3="0.00" tag4="2.00">maybe some text here?</somethingElse>
<!-- ... -->

我想要发生的是:

If tag1 = A or D
And tag2 = B
then set tag3 value = tag4 value

所以这需要第 1 行和第 3 行并将 tag3 更新为 2.00

所以我需要的完整代码是: 打开文件 执行编辑 保存文件

【问题讨论】:

  • 您在此处显示的不是 XML 文件。请显示一个实际的输入文件以及在这种情况下输出的具体内容。更多帮助:stackoverflow.com/help/mcve.
  • 好吧,你尝试了什么,什么不起作用?
  • 我们是一个帮助程序员和编程爱好者的社区。话虽如此,希望您在发布之前展示您所做或尝试过的事情。这为我们提供了一些基础。到目前为止,这看起来像是一个代码编写请求,这与 SO 无关。将您的问题分解为各个部分,并单独搜索这些问题的解决方案。然后,如果您仍有问题,请edit 展示您的工作,以便我们更好地帮助您和社区。​​span>
  • 对不起,我是 SO 和 powershell 的新手。我可以拼凑不同的部分,但不知道如何在 powershell 中格式化。我使用以下正则表达式来查找受影响的行: A[^]+tag3="0 我知道如何在 sql 中编写 if then's 但不确定如何翻译上述正则表达式以及粗略的 if then 语句上面列出的。我会得到更多并更新。谢谢。

标签: xml powershell xpath


【解决方案1】:

1) 使用 SelectNodes 函数和适当的 XPath 语句来查找要更新的元素。

'//*[(./@tag1=''A'' or ./@tag1=''D'') and ./@tag2 = ''B'']'

上面的代码说找到任何具有tag1 属性值'A''D' 并且还具有属性tag2'B' 的元素。

2) 对于上面找到的每个元素,将该元素的 tag3 属性分配为其 tag4 属性的值。

| %{ #%{ is an alias (i.e. shorthand) for `| foreach-object`
    $_.tag3 = $_.tag4
}

完整解决方案(带有示例数据)

$xml = [xml]@"
<xml>
<something tag1="A" tag2="B" tag3="0.00" tag4="2.00" />
<something tag1="C" tag2="B" tag3="0.00" tag4="2.00" />
<something tag1="D" tag2="B" tag3="0.00" tag4="2.00" />
</xml>
"@
$xml.SelectNodes('//*[(./@tag1=''A'' or ./@tag1=''D'') and ./@tag2 = ''B'']') | %{
    $_.tag3 = $_.tag4
}


##Demo Output (function from https://blogs.msdn.microsoft.com/powershell/2008/01/18/format-xml/)
function Format-XML ([xml]$xml, $indent=2) 
{ 
    $StringWriter = New-Object System.IO.StringWriter 
    $XmlWriter = New-Object System.XMl.XmlTextWriter $StringWriter 
    $xmlWriter.Formatting = 'indented'
    $xmlWriter.Indentation = $Indent 
    $xml.WriteContentTo($XmlWriter) 
    $XmlWriter.Flush() 
    $StringWriter.Flush() 
    Write-Output $StringWriter.ToString() 
}
Format-XML $xml

更新

我还注意到您提到从文件中读取 XML 并将其保存回文件...而在上面我只是直接为 $xml 变量分配了一个值,并在屏幕上显示了输出。

要从文件中读取 XML,请使用 $xml = [raw](get-content 'c:\path\to\file.xml' -raw)。更多信息(实际上,方法略有不同):

要将 XML 保存回文件,只需使用 $xml.Save('c:\path\to\file.xml')

再次,更多信息和替代方法在这里:

【讨论】:

  • 非常感谢。我仍在学习,所以查看与我想要它做的相关的代码是我了解每个部分在做什么的最佳方式。我会试一试,感谢您的宝贵时间。
  • 不用担心。我在上面的 cmets 中发现您提到了正则表达式。注意:虽然在某些情况下您必须使用正则表达式(例如,如果处理格式错误的 XML),但通常最好使用 XPath;专为该场景设计的技术/语言。一个好的入门者是w3schools.com/xml/xpath_intro.asp。对于 PowerShell,我通过goodreads.com/book/show/… 学习并强烈推荐给其他人......尽管还有许多其他可用资源。 slant.co/improve/topics/1060
猜你喜欢
  • 1970-01-01
  • 2018-06-04
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多