使用从Xml读取的变量,并使用它通过Powershell从另一个xml搜索元素

时间:2019-06-05 12:47:09

标签: xml powershell

这是snpdate.xml

<skata serial="GSI100-A-00103"/>

这是test.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Clients xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <set>
    <indexlist>
        <index name="mario1" sn="GSI100-A-00100" status="ok" version="v49" />
        <index name="mario2" sn="GSI100-A-00101" status="ok" version="v49" />
        <index name="mario3" sn="GSI100-A-00102" status="ok" version="v49" />
        <index name="mario4" sn="GSI100-A-00103" status="OFF" version="v49" />
        <index name="mario5" sn="GSI100-A-00104" status="ok" version="v49" />
        <index name="mario6" sn="GSI100-A-00105" status="ok" version="v49" />
        <index name="mario7" sn="GSI100-A-00106" status="ok" version="v49" />
    </indexlist>
    </set>
    </Clients>

$xmloff = New-Object System.Xml.XmlDocument
$xmlold = "C:\Program Files (x86)\GSI\Atreus\snupdate.xml" 
$xmledit = "C:\Users\bigadmin\Desktop\Projects\AutoUpdate\test.xml"
[xml]$Xmlsn = Get-Content($xmlold) -Encoding UTF8    #open 1st xml
[xml]$Xmlnew = Get-Content($xmledit) -Encoding UTF8  #open 2st xml

$you = $Xmlsn.SelectSingleNode("//skata/@serial") #get value of serial element
$you.Value #prints correct value


$attr = $Xmlnew.SelectSingleNode("//Clients/set/indexlist/index[@sn='$you']/@status")
#from the second xml trying to get the value of status based on sn taking #the variable of $you. returns null.instead of OFF. if i manually insert   
#[@sn='GSI100-A-00103'] instead of "$you" i get the correct result.    

 $attr.Value 

我正在尝试从第二个xml获取基于sn的status值,并使用变量$you。它返回null而不是OK。如果我手动插入
我得到了正确的结果,而不是[@sn='GSI100-A-00103'],而不是$you。 我想使用值为$you的{​​{1}}变量,并在另一个xml上使用它来查找status = off的新元素值。我认为问题是该变量是从其他xml加载的?

1 个答案:

答案 0 :(得分:1)

您需要将if(Vector3.Distance(obstaclesToSpawn[index].transform.position, transform.position)>=distBeforeNextObstacle) { //Spawn next obstacle } 与字符串sn而不是XmlAttribute $you.Value进行比较。由于您需要检索带引号的字符串内的属性值,因此使用$you运算符。

$()

说明:

在字符串内检索对象的属性时,变量扩展将从$attr = $Xmlnew.SelectSingleNode("//Clients/set/indexlist/index[@sn='$($you.Value)']/@status") 字符处停止。这些情况需要使用子表达式运算符.。运算符告诉PowerShell解析器重新基于$()字符来评估解析模式,而不是将.视为文字字符串。

您可以在下面的示例中看到它:

.propertyname

这是子表达式运算符上的Microsoft's Page