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


114

假设我有一个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>

Answers:


214

试试这个:

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

编辑:正如注释中指出的那样,如果属性不存在,则将引发异常。安全的方法是:

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

34
请谨慎使用此方法。我认为,如果属性不存在,则访问Value成员将导致Null引用异常。
克里斯·

3
if(node.Attributes!= null)字符串employeeName = chldNode.Attributes [“ Name”]。Value;
Omidoo 2012年

7
@Omidoo这种方法具有相同的问题,例如with <a x="1" />,它可以通过测试。也许类似的东西var attr = node.Attributes["Name"]; if(attr != null) {...}可能会起作用。
Joel Peltonen 2012年

下面查看我的答案,它可以避免NullException问题,并且使用起来更安全。
Marco7757 '16

44

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

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

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

6
node.Attributes?[“ Name”] ?. Value是不获取null的错误的简便方法
。brandonstrong,

1
同样正确的是,尽管我要指出的唯一一点是,尽管您可以在一行中做到这一点(使其适合于分配任务或其他事情),但是在引发异常或以其他方式处理时进行控制时灵活性较差节点没有属性的情况。
阿里·罗斯

1
同意 任何使用速记方式的人都应始终确保不会造成下游问题。
brandonstrong

17

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

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

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

这将是更理想.. :)
谢卡尔轩泰

4

如果只需要名称,则使用xpath即可。无需自己进行迭代并检查是否为null。

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(尽管我希望有)。这个方法呢!谢谢!
Frecklefoot

4

如果您使用chldNodeXmlElement,而不是XmlNode,您可以使用

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

返回值只是一个空字符串,如果属性名称不存在。

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

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

foreach (XmlElement node in nodes)
{
    var attributeValue = node.GetAttribute("Name");
}

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



1

您也可以使用它;

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

1

另一个解决方案:

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

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

当期望的属性attributeName实际上不存在时,它还避免了异常。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.