2015-01-16 48 views
0

我已经谷歌搜索如何做到这一点,我很努力去理解。我目前有这个XML通过PowerShell为XML添加新值

<?xml version="1.0" encoding="utf-8"?> 
<gl:GLOBALLISTS Xmlns:gl="http://schemas.microsoft.com/VisualStudio/2005/workitemtracking/globallists"> 
<GLOBALLIST name="ListOfVersions - PWCC"> 
<LISTITEM value="1.1.3.2705" /> 
<LISTITEM value="1.1.4.2801" /> 
<LISTITEM value="1.1.4.2802" /> 
<LISTITEM value="1.1.4.2803" /> 
<LISTITEM value="1.1.4.2804" /> 
<LISTITEM value="1.1.5.2901" /> 
<LISTITEM value="1.1.5.2902" /> 
<LISTITEM value="Unknown" /> 
</GLOBALLIST> 
</gl:GLOBALLISTS> 

在C:\驱动器位置。我想使用PowerShell使用$ NewListItem添加新的列表项值。所以我可以在每次需要时指定。所以列表现在包括1.1.5.2903作为一个例子。我尝试过使用其他网站上提供的其他代码,但没有运气。

任何帮助将非常appricated

回答

0

这里是如何做到这一点(但你需要改变你的输入是有效的XML,使用了“xmlns”必须是小写)。

PS C:\temp> cat t.xml 
<?xml version="1.0" encoding="utf-8"?> 
<gl:GLOBALLISTS xmlns:gl="http://schemas.microsoft.com/VisualStudio/2005/workitemtracking/globallists"> 
<GLOBALLIST name="ListOfVersions - PWCC"> 
<LISTITEM value="1.1.3.2705" /> 
<LISTITEM value="1.1.4.2801" /> 
<LISTITEM value="1.1.4.2802" /> 
<LISTITEM value="1.1.4.2803" /> 
<LISTITEM value="1.1.4.2804" /> 
<LISTITEM value="1.1.5.2901" /> 
<LISTITEM value="1.1.5.2902" /> 
<LISTITEM value="Unknown" /> 
</GLOBALLIST> 
</gl:GLOBALLISTS> 
PS C:\temp> [xml]$data = [xml](get-content c:\temp\t.xml) 
PS C:\temp> $item = $data.CreateElement('LISTITEM') 
PS C:\temp> $item.SetAttribute('value', "1.1.5.2903") 
PS C:\temp> [void]$data.GLOBALLISTS.GLOBALLIST.appendChild($item) 
PS C:\temp> $data.save('c:\temp\t2.xml') 
PS C:\temp> cat t2.xml 
<?xml version="1.0" encoding="utf-8"?> 
<gl:GLOBALLISTS xmlns:gl="http://schemas.microsoft.com/VisualStudio/2005/workitemtracking/globallists"> 
    <GLOBALLIST name="ListOfVersions - PWCC"> 
    <LISTITEM value="1.1.3.2705" /> 
    <LISTITEM value="1.1.4.2801" /> 
    <LISTITEM value="1.1.4.2802" /> 
    <LISTITEM value="1.1.4.2803" /> 
    <LISTITEM value="1.1.4.2804" /> 
    <LISTITEM value="1.1.5.2901" /> 
    <LISTITEM value="1.1.5.2902" /> 
    <LISTITEM value="Unknown" /> 
    <LISTITEM value="1.1.5.2903" /> 
    </GLOBALLIST> 
</gl:GLOBALLISTS> 

如果您有多个GLOBALLIST项目,你就需要使用XPath来选择合适的一个:

$node = $data.SelectSingleNode("//GLOBALLIST[@name='ListOfVersions - PWCC']") 
$node.appendChild($item) 

或者你可以匹配属性的一部分:

$node = $data.SelectSingleNode("//GLOBALLIST[contains(@name, 'ListOfVersions']") 
+0

非常感谢你太多 – 4d554d424c4553

+0

如果我有一个以上的全球主义项目,我该怎么办?例如ListOfVersion和一个ListOfServers。当我添加另一个全局列表项时,上面的代码将写入我添加的最后一个全局列表。 – 4d554d424c4553

+0

@ScottEmberson我扩展了我的答案,向您展示如何使用XPath选择特定节点 – Duncan