2017-04-12 48 views
2

我试图读取属性的值,检查另一个属性的值。下面是我有的XML的内容。从XPath检索属性值与来自同一节点的另一个属性值匹配

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <targets> 
    <target name="default" xsi:type="File" layout="${longdate}${message}${exception:format=tostring}" fileName="${basedir}/logs/Test24x7.txt" archiveAboveSize="999000" maxArchiveFiles="100" archiveEvery="Day"/> 
    <target name="f7" xsi:type="File" layout="${longdate}${message}${exception:format=tostring}" fileName="${basedir}/logs/Errors/error.txt" archiveAboveSize="300000" maxArchiveFiles="100" archiveEvery="Day"/> 
    </targets> 
    <rules> 
    <!-- <logger name="*" minLevel="Debug" appendTo="f0"/> --> 
    <logger name="*" minLevel="Info" appendTo="default"/> 
    <logger name="*" minLevel="Error" appendTo="f7"/> 
    </rules> 
</nlog> 

在这里,我需要从name属性值为“default”的元素目标中获取属性archiveAboveSize的值。以下是我写的代码。

XmlDocument doc = new XmlDocument(); 
doc.Load("file.exe.nlog"); 
var node = doc.DocumentElement.SelectSingleNode("//nlog/targets/target[@name = 'default']/@archiveAboveSize"); 
return node.Value; 

但是我变量节点一直变空。我在这里做错了什么?任何帮助将非常感激。

回答

2

您可以使用Linq to XML来获取所需的属性值。

使用此行:

var doc = XDocument.Load("file.exe.nlog");  

可以加载XML文件,然后使用查询它:

var res = doc.Descendants() 
      .Where(e => e.Name.LocalName == "target") 
      .Where(e => e.Attribute("name").Value == "default") 
      .First() 
      .Attribute("archiveAboveSize").Value; 

LocalName财产的使用。这是由于您的xml文件中使用了一个命名空间。

相关问题