使用powershell将另一个子元素附加到xml

时间:2014-03-20 11:23:47

标签: xml powershell

我有以下xml文件。 我想补充一些东西,我尝试了几种不同的方法,但似乎无法做到正确。

这就是xml文件的样子。

<Root>
 <Device>
  <Name>c:</Name>
   <Time>
    <TimeOfCheck>2014.3.18.22.36.43</TimeOfCheck>
    <Size>120.14</Size>
    <FreeSpace>38.18</FreeSpace>
  </Time>
 </Device>
 <Device>
  <Name>x:</Name>
   <Time>
    <TimeOfCheck>2014.3.18.22.36.43</TimeOfCheck>
    <Size>23.23</Size>
    <FreeSpace>11.47</FreeSpace>
   </Time>
 </Device>
</Root>

我正在尝试添加此

<Time>
 <TimeOfCheck>2014.3.18.22.36.43</TimeOfCheck>
 <Size>120.14</Size>
 <FreeSpace>25</FreeSpace>
</Time>

所以它最终看起来像

<Root>
 <Device>
  <Name>c:</Name>
   <Time>
    <TimeOfCheck>2014.3.18.22.36.43</TimeOfCheck>
    <Size>120.14</Size>
    <FreeSpace>38.18</FreeSpace>
   </Time>
   <Time>
    <TimeOfCheck>2014.3.18.22.36.43</TimeOfCheck>
    <Size>120.14</Size>
    <FreeSpace>25</FreeSpace>
   </Time>
 </Device>
 <Device>
  <Name>x:</Name>
   <Time>
    <TimeOfCheck>2014.3.18.22.36.43</TimeOfCheck>
    <Size>23.23</Size>
    <FreeSpace>11.47</FreeSpace>
   </Time>
  </Device>
</Root>

这是加载xml文件的代码,检查是否存在名为C:或D:

的节点
# Set the File Name
$filePath = "C:\dump\Report.xml"

# load the values that we going to add to the file  
$disk = Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3" | Select-Object DeviceID,@{Name="Size";Expression={"{0:N2}" -f($_.Size/1GB)}},@{Name="FreeSpace";Expression={ "{0:N2}" -f ($_.FreeSpace/1GB) }},@{Name="Time";Expression={Get-Date -format yyyy.M.d.H.mm.ss}}

# check if the file exists 

If (Test-Path $filePath)
{#If the file exists 
  #load the file 
 [xml]$XmlExists = Get-Content $filePath

 foreach($obj in $disk)
 {$Node = "//Device/Name[text() ='" + $obj.DeviceID + "']"
  $NodesTest =$XmlExists.SelectNodes("$node")
    #check if the node exists 
      IF ($NodesTest.get_Count() -gt 0)
        {
      # The node exists but how do we add to it 

        }
     Else 
        {
         # The node does not exists how do we crate it 

        }
 }
}

修改1#

好的,已经设法使用此代码使其工作。

$AppendPath = "//Device[Name/text() ='" + $obj.DeviceID + "']"
                # Build the xml to Append

                $Time = $XmlExists.CreateElement('Time')
                $TimeOfCheck = $XmlExists.CreateElement('TimeOfCheck')
                               $TimeOfCheck.set_InnerText($obj.time)
                $Size = $XmlExists.CreateElement('Size')
                        $Size.set_InnerText($obj.Size)
                $FreeSpace = $XmlExists.CreateElement('FreeSpace')
                             $FreeSpace.set_InnerText($obj.FreeSpace)
                #Append opjects

                $Time.AppendChild($TimeOfCheck)
                $Time.AppendChild($Size)
                $Time.AppendChild($FreeSpace)

                $NodeToAppendTo= $XmlExists.SelectSingleNode($AppendPath)
                $NodeToAppendTo.AppendChild($Time)
                $XmlExists.Save($filePath)

1 个答案:

答案 0 :(得分:1)

要插入节点,XmlElement类型上有许多方法(文档中每个元素都有一个实例)。

要将$ne元素添加为名为XmlElement的{​​{1}}的最后一个孩子:

$xe

(如果$xe.InsertAfter($ne, $xe.LastChild) 没有孩子,那么$xe将为none,这意味着$xe.LastChild会在子项列表的开头插入,这在空的时候就可以了。)

要创建新元素,您可以InsertAfter。但是,如果您想要创建的大部分内容不是动态确定的,请创建一个字符串并解析,然后从该文档导入以插入到另一个文档中:

XmlDocument.CreateElement