如何在C#中选择具有给定属性值的节点?

10 浏览
0 Comments

如何在C#中选择具有给定属性值的节点?

我只想选择具有"name"属性值为'syslog'的目标元素。无论如何,我总是遇到一个NullReferenceException异常。有人可以帮我找出问题在哪里吗?

我的代码如下:

XmlNode root = _configFile.DocumentElement; // root不为空,并且是正确的。
XmlNode syslogNode = root.SelectSingleNode("descendant::targets/target[@name='syslog']"); // syslogNode为空

我的XML文件如下:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

fileName="${specialfolder:folder=LocalApplicationData}/Televic Conference/CoCon/Log/server_log_${shortdate}.txt"

archiveFileName="${specialfolder:folder=LocalApplicationData}/Televic Conference/CoCon/Log/Archives/server_log.{#}.txt"

archiveEvery="Day" archiveNumbering="Rolling" maxArchiveFiles="20" concurrentWrites="true" keepFileOpen="false"/>

0
0 Comments

在C#中,有一个问题涉及到如何选择具有给定属性值的节点。解决这个问题的方法是使用LINQ to XML。下面是一个使用LINQ to XML解决该问题的示例代码:

XElement doc = XElement.Load("yourStream.xml");
XNamespace g = "http://www.nlog-project.org/schemas/NLog.xsd"; //全局命名空间g
foreach (var itm in doc.Descendants(g + "targets").Where(x => x.Attribute("name").Value == "syslog"))
{
    itm; //你所需要的节点
}

以上代码首先加载了一个XML文档,然后定义了一个全局命名空间g。接下来,使用LINQ to XML的Descendants方法来选择所有名为"targets"的子节点。然后,使用Where方法来筛选出具有名为"name"的属性值为"syslog"的节点。最后,使用foreach循环遍历选定的节点并进行相应的操作。

通过使用LINQ to XML,我们可以方便地选择具有给定属性值的节点,从而解决了这个问题。

0
0 Comments

在C#中,有一个问题是如何根据给定的属性值选择一个节点。这个问题的出现是因为文档中存在一个默认的命名空间,你需要在XPath表达式中考虑或忽略它。

解决这个问题的方法是参考以下链接:XPath select node with namespace

在这个链接中,你可以找到一个关于如何处理XPath命名空间的解决方案。根据这个解决方案,你可以通过在XPath表达式中使用命名空间前缀来选择具有给定属性值的节点。

以下是使用C#的示例代码:

XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);
XmlNamespaceManager nsManager = new XmlNamespaceManager(doc.NameTable);
nsManager.AddNamespace("ns", "http://example.com/namespace");
XmlNode node = doc.SelectSingleNode("//ns:element[@attribute='value']", nsManager);

在这个示例中,我们首先加载XML文档,并创建一个XmlNamespaceManager对象来管理命名空间。然后,我们使用AddNamespace方法将命名空间添加到XmlNamespaceManager中。接下来,我们使用SelectSingleNode方法和XPath表达式来选择具有给定属性值的节点。

通过这种方式,你可以在C#中选择具有给定属性值的节点,解决了这个问题。

0