如何在 C# 中从 XmlNode 读取属性值?

Posted

技术标签:

【中文标题】如何在 C# 中从 XmlNode 读取属性值?【英文标题】:How to read attribute value from XmlNode in C#? 【发布时间】:2010-12-08 16:12:19 【问题描述】:

假设我有一个 XmlNode,我想获取一个名为“Name”的属性的值。 我该怎么做?

XmlTextReader reader = new XmlTextReader(path);

XmlDocument doc = new XmlDocument();
XmlNode node = doc.ReadNode(reader);

foreach (XmlNode chldNode in node.ChildNodes)

     **//Read the attribute Name**
     if (chldNode.Name == Employee)
                         
         if (chldNode.HasChildNodes)
         
             foreach (XmlNode item in node.ChildNodes)
              

             
         
      

XML 文档:

<Root>
    <Employee Name ="TestName">
    <Childs/>
</Root>

【问题讨论】:

【参考方案1】:

试试这个:

string employeeName = chldNode.Attributes["Name"].Value;

编辑: 正如 cmets 中所指出的,如果该属性不存在,这将引发异常。安全的方法是:

var attribute = node.Attributes["Name"];
if (attribute != null)
    string employeeName = attribute.Value;
    // Process the value here

【讨论】:

小心这种方法。我认为如果该属性不存在,那么访问 Value 成员将导致 Null 引用异常。 if(node.Attributes != null) string employeeName = chldNode.Attributes["Name"].Value; @Omidoo 这种方法也有同样的问题,例如&lt;a x="1" /&gt;,它通过了测试。也许像var attr = node.Attributes["Name"]; if(attr != null) ... 这样的东西可能会起作用。 看看my answer below,它规避了 NullException 问题,也许?使用起来更安全。【参考方案2】:

为了扩展 Konamiman 的解决方案(包括所有相关的空检查),这就是我一直在做的事情:

if (node.Attributes != null)

   var nameAttribute = node.Attributes["Name"];
   if (nameAttribute != null) 
      return nameAttribute.Value;

   throw new InvalidOperationException("Node 'Name' not found.");

【讨论】:

避免空值错误的简写方法是 node.Attributes?["Name"]?.Value 也是正确的,虽然我要指出的唯一一件事是,虽然你可以在一行中做到这一点(使它有利于分配或其他东西),但它在控制方面不太灵活当您抛出异常或以其他方式处理节点没有属性的情况时。 同意。任何使用速记方式的人都应始终确保它不会在下游造成问题。【参考方案3】:

您可以像处理节点一样遍历所有属性

foreach (XmlNode item in node.ChildNodes)
 
    // node stuff...

    foreach (XmlAttribute att in item.Attributes)
    
        // attribute stuff
    

【讨论】:

这会更可取..:)【参考方案4】:

如果您将chldNode 用作XmlElement 而不是XmlNode,则可以使用

var attributeValue = chldNode.GetAttribute("Name");

return value will just be an empty string,以防属性名不存在。

所以你的循环可能看起来像这样:

XmlDocument document = new XmlDocument();
var nodes = document.SelectNodes("//Node/N0de/node");

foreach (XmlElement node in nodes)

    var attributeValue = node.GetAttribute("Name");

这将选择被&lt;Node&gt;&lt;N0de&gt;&lt;/N0de&gt;&lt;Node&gt;标签包围的所有节点&lt;node&gt;,然后循环遍历它们并读取属性“名称”。

【讨论】:

【参考方案5】:

如果您只需要名称,请改用 xpath。无需自己进行迭代并检查是否为空。

string xml = @"
<root>
    <Employee name=""an"" />
    <Employee name=""nobyd"" />
    <Employee/>
</root>
";

var doc = new XmlDocument();

//doc.Load(path);
doc.LoadXml(xml);

var names = doc.SelectNodes("//Employee/@name");

【讨论】:

上述方法不适用于我的 XML(尽管我希望它们有)。这个方法可以!谢谢!【参考方案6】:

使用

item.Attributes["Name"].Value;

获取价值。

【讨论】:

【参考方案7】:

你也可以用这个;

string employeeName = chldNode.Attributes().ElementAt(0).Name

【讨论】:

【参考方案8】:

另一种解决方案:

string s = "??"; // or whatever

if (chldNode.Attributes.Cast<XmlAttribute>()
                       .Select(x => x.Value)
                       .Contains(attributeName))   
   s =  xe.Attributes[attributeName].Value;

也避免了预期属性attributeName实际上不存在时的异常。

【讨论】:

以上是关于如何在 C# 中从 XmlNode 读取属性值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个项目中从 C# 中的多个配置文件中读取值?

如何检查多个 XMLNode 属性的空值?

C#如何在xmlnode中存储网站列表

如何在 C# 中从位图中读取文本? [关闭]

如何在 C# 中从包含 XML 的字符串中读取数据?

读取 xmlnode 子标签值