2014-08-29 69 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>