我有一个看起来像这样的xml文件。
<?xml version="1.0" encoding="utf-8"?>
<Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<PreviousFolderVersion>2.0.0.0</PreviousFolderVersion>
<FileMajor>2</FileMajor>
<FileMinor>0</FileMinor>
<FileBuild>0</FileBuild>
<FileRevision>0</FileRevision>
<ProductMajor>2</ProductMajor>
<ProductMinor>0</ProductMinor>
<ProductBuild>0</ProductBuild>
<ProductRevision>0</ProductRevision>
<FolderMajor>2</FolderMajor>
<FolderMinor>0</FolderMinor>
<FolderBuild>0</FolderBuild>
<FolderRevision>0</FolderRevision>
<FileVersion>2.0.0.0</FileVersion>
<ProductVersion>2.0.0.0</ProductVersion>
<FolderVersion>2.0.0.0</FolderVersion>
</Settings>
增加和更新版本节点的最佳方法是什么?
我一直在尝试使用此页面上描述的内容的变体,但是: http://blogs.msdn.com/b/sonam_rastogi_blogs/archive/2014/05/14/update-xml-file-using-powershell.aspx
如:
$path = "C:\Workspaces\Ahltaprint\Build\Settings.xml"
$xml = [xml](Get-Content $path)
$fileBuild = $xml.Settings.FileBuild
$newChild = $xml.CreateElement("FileBuild")
$newChild.InnerText = "100"
$xml.Settings.ReplaceChild($newChild, $fileBuild)
$xml.Save($path)
但它似乎不起作用。我收到如下错误:
无法转换参数“1”,值为“0”,“ReplaceChild”为 键入“System.Xml.XmlNode”:“无法转换类型的”0“值 “System.String”键入“System.Xml.XmlNode”。“At C:\ Workspaces \ Ahltaprint \ Build \ buildawp.ps1:157 char:1 + $ xml.Settings.ReplaceChild($ newChild,$ fileBuild) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:NotSpecified:(:) [],MethodException + FullyQualifiedErrorId:MethodArgumentConversionInvalidCastArgument
答案 0 :(得分:1)
显然在Powershell中有多种方法可以处理XML文件,但我通常觉得使用XPath表达式最简单:
$xml.SelectSingleNode("/Settings/FileBuild").InnerText = "2"
$xml.Settings.FileBuild # Produces "2"
顺便说一下,你的代码片段不起作用的原因是因为虽然$xml.Settings
的类型为XmlElement
,但$xml.Settings.FileBuild
不是 - 而是,它是一个字符串,可能是因为它是一个“简单”元素,即没有子元素或属性。
如果你得到像这样的FileBuild,它的是类型为XmlElement
,其余的替换代码将起作用:
$fileBuild = $xml.Settings.GetElementsByTagName("FileBuild")[0]
您可以通过在变量或表达式上调用GetType()
来验证这一点:
$fileBuild.GetType() # Produces XmlElement