2014-08-29 65 views
2

命名空間中選擇一個XML使用XPath屬性我有一個內部節點NLOG一個.NET配置文件:與使用PowerShell

<?xml version="1.0"?> 
<configuration> 
    <appSettings> 
    </appSettings> 
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <targets async="true"> 
     <target xsi:type="File" name="f" fileName="path to file" /> 
    </targets> 
    <rules> 
     <logger name="*" minlevel="Debug" writeTo="c,f" /> 
    </rules> 
    </nlog> 
</configuration> 

我試圖改變使用PowerShell中的targetfileName值。

我使用這個代碼:

[xml]$xml = Get-Content $file 
$ns = New-Object System.Xml.XmlNamespaceManager($xml.NameTable) 
$ns.AddNamespace("ns", $namespace) # $namespace is `http://www.nlog-project.org/schemas/NLog.xsd` 
$values = $xml.selectNodes($xpath, $ns) 

我的XPath表達式是//ns:nlog/ns:targets/ns:target[@ns:name='f']/@ns:fileName

但是$值總是0的結果。

有什麼想法?我究竟做錯了什麼 ?

謝謝!

回答

3

在你的XML文檔,有一個默認命名空間

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"> 

後代元素,然後用隱這個命名空間的前綴。但是,attributes do not take on a default namespace。換句話說,輸入XML中的屬性是而不是,稱爲ns:fileName,但只有fileName。這同樣適用於name屬性。

//ns:nlog/ns:targets/ns:target[@name='f']/@fileName 

根據您的XML(和可預測性)的結構,你可能要縮短表達

//ns:target[@name='f']/@fileName 

爲了讓您INTIAL XPath表達式的工作,在輸入XML將有看起來像:

<targets xmlns:ns="http://www.nlog-project.org/schemas/NLog.xsd" async="true"> 
    <target xsi:type="File" ns:name="f" ns:fileName="path to file" /> 
</targets>