我有以下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)
答案 0 :(得分:1)
要插入节点,XmlElement
类型上有许多方法(文档中每个元素都有一个实例)。
要将$ne
元素添加为名为XmlElement
的{{1}}的最后一个孩子:
$xe
(如果$xe.InsertAfter($ne, $xe.LastChild)
没有孩子,那么$xe
将为none,这意味着$xe.LastChild
会在子项列表的开头插入,这在空的时候就可以了。)
要创建新元素,您可以InsertAfter
。但是,如果您想要创建的大部分内容不是动态确定的,请创建一个字符串并解析,然后从该文档导入以插入到另一个文档中:
XmlDocument.CreateElement