2015-10-05 56 views
1

我有一个看起来像这样的xml文件。如何增加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“。”在 C:\ Workspaces \ Ahltaprint \ Build \ buildawp.ps1:157 char:1 + $ xml.Settings.ReplaceChild($ newChild,$ fileBuild) +〜~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~ + CategoryInfo:NotSpecified:(:) [],MethodException + FullyQualifiedErrorId:MethodArgumentConversionInvalidCastArgument

回答

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

星座,谢谢你的建议和例子! – GhostHunterJim