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>

回答:


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参照例外が発生すると思います。
Chris Dunaway、

3
if(node.Attributes!= null)string employeeName = chldNode.Attributes ["Name"]。Value;
Omidoo 2012

7
@Omidooこのアプローチには同じ問題<a x="1" />があります。たとえば、テストに合格したを使用した場合などです。おそらく何かvar attr = node.Attributes["Name"]; if(attr != null) {...}がうまくいくかもしれません。
Joel Peltonen、2012年

以下の私の回答を見てください。これはNullExceptionの問題を回避し、多分安全に使用できます。
Marco7757

44

コナミマンのソリューション(関連するすべてのnullチェックを含む)を拡張するために、これは私がやってきたことです:

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

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

6
nullのエラーを取得しない簡単な方法はnode.Attributes?["Name"] ?. Value
brandonstrong

1
また、私が指摘する唯一のことは真実ですが、1行でそれを行うことができます(割り当てなどに適しています)が、例外をスローしたり、その他の方法で処理したりする場合の制御に関しては、柔軟性が少し低くなります。ノードに属性がない場合。
Ari Roth

1
同意した。省略形を使用する人は、それがダウンストリームで問題を引き起こさないことを常に確認する必要があります。
ブランドンストロング2017

17

ノードと同じようにすべての属性をループできます

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

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

これがより好ましいでしょう.. :)
SHEKHAR SHETE 2017

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

の代わりにchldNodeとして使用する場合、使用できますXmlElementXmlNode

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実際に存在しない場合の例外も回避します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.