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

looping through element of XDocument and getting specific attributes

我目前正在将 XmlDocument 和 XmlElements 重写为 XDocument 和 XElement。我 运行 遇到了一个小问题,我曾经只是 select 一个节点 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

的正确方法是什么

您想使用 XElement.Elements() to iterate through all child elements of your requests element, then use XElement.Attribute(XName name) 按名称获取指定的属性。

可能 也会考虑 explicitly casting your XAttribute to a string rather than using the Value 属性,因为前者会 return 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"));
    }
}