• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:HasAttributes 的な関数はないでしょう)

C#でXMLファイルを読み込んで「view」アトリビュートがあるタグにだけ処理をしたい方法

このQ&Aのポイント
  • C# WPFでXMLファイルを読み込んで、「view」アトリビュートがあるタグにだけ処理をする方法について教えてください。
  • number=2以降のタグには「view」アトリビュートがないため、エラーが発生してしまいます。全てのpageタグにviewアトリビュートを付けずにエラーを回避する方法はありますか?
  • お手数ですが、C#でXMLファイルを読み込んで、viewアトリビュートがあるタグのみを処理したい場合について詳細な手順を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

using System; using System.Xml; class Program { static void Main() { XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load("trial.xml"); //読み込み foreach ( XmlNode node in xmlDocument.SelectNodes("/data/page") ) { // attribute:"view"が存在し、その値が"on"ならなんかする XmlAttribute attribute = node.Attributes["view"]; if ( attribute != null && attribute.Value == "on" ) { Console.WriteLine(node.Attributes["number"].Value); } } } }

その他の回答 (1)

回答No.1

A案) XPath側で処理する XPathに[]を使うと,テストができます。 > XmlNodeList nodeList = xmlDocument.SelectNodes("/data/page"); を XmlNodeList nodeList = xmlDocument.SelectNodes("/data/page[@view]"); とすると,「view属性がある場合」になります。さらに, XmlNodeList nodeList = xmlDocument.SelectNodes("/data/page[@view='on']"); とすると,「view属性があって,その値が'on'の場合」となります。 B案) XmlDocument側で処理する B-1案) XmlAttributeのnullチェックで分岐 > if("on"==nodeList[i].Attributes["view"].Value) で,ちゃんとnullチェックをするのは基本的な方法です。 if (nodelist[i].Attributes["view"] != null && nodeList[i].Attributes["view"].Value == "on") B-2案) XmlElementにキャストする XmlNodeではなく,XmlElementならばGetAttributeやHasAttributeといったメソッドがあります。 まず, var elem = nodeList[i] As XmlElement; を用意して (VS 2005ならばvarではなくXmlElementを使う), > if("on"==nodeList[i].Attributes["view"].Value) を if (elem != null && elem.HasAttribute("view") && elem.GetAttribute("view") == "on") または if (elem != null && elem.GetAttribute("view") == "on") / とすることになります。 # GetAttributeは属性がない場合に""を返す for文をforeach文にして,列挙される型をXmlElementにすれば,asによるキャストは不要になりま す。