如何在xml文件中增加节点

时间:2015-10-05 16:01:58

标签: c# xml powershell

我有一个看起来像这样的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

1 个答案:

答案 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