循环遍历XDocument的元素并获取特定属性

本文关键字:获取 属性 元素 遍历 XDocument 循环 | 更新日期: 2023-09-27 18:21:48

我目前正在将XmlDocument和XmlElements重写为XDocument和XElement。我遇到了一个小问题,我过去只是简单地选择一个节点ModuleRequests,然后循环通过它

var propertiesRequested = new XmlDocument();
propertiesRequested.LoadXml(propertiesConfiguration);
var requests = propertiesRequested.SelectSingleNode("ModuleRequests");
foreach (XmlNode request in requests)
{
    var propertyValue = request.Attributes["Id"].Value;
    if (systemProperties.ContainsKey(propertyValue) == false)
    {
        systemProperties.Add(propertyValue, request.Attributes["Request"].Value);
    }
}

对此:

var propertiesRequested = XDocument.Parse(propertiesConfiguration);
var requests = propertiesRequested.Element("ModuleRequests");
foreach (XNode request in requests)
{
    var propertyValue = request.Attributes["Id"].Value;
    if (systemProperties.ContainsKey(propertyValue) == false)
    {
        systemProperties.Add(propertyValue, request.Attributes["Request"].Value);
    }
}

不用说,这并没有那么容易,然后我想我会成功的:

foreach(XNode request in requests.Nodes())

但这给我带来了更多的问题,因为XNode没有属性。

正如你可能知道的,在xml阅读方面,我有点新手。我希望有人能帮我。从XmlDocument重写到XDocument 的正确方法是什么

循环遍历XDocument的元素并获取特定属性

您希望使用XElement.Elements()迭代requests元素的所有子元素,然后使用XElement.Attribute(XName name)按名称获取指定的属性。

还可以考虑将XAttribute显式强制转换为字符串,而不是使用Value属性,因为前者将在缺少的属性上返回null,而不是生成null引用异常。

因此:

var propertiesRequested = XDocument.Parse(propertiesConfiguration);
var requests = propertiesRequested.Element("ModuleRequests");
foreach (var request in requests.Elements())
{
    var propertyValue = (string)request.Attribute("Id");
    if (systemProperties.ContainsKey(propertyValue) == false)
    {
        systemProperties.Add(propertyValue, (string)request.Attribute("Request"));
    }
}