• ベストアンサー

XPathで値を取得して設定する方法

質問です。 <?xml version="1.0" encoding="UTF-8"?> <ABC> <tarou id="pen" value="1" /> </ABC> とABCの太郎のペンは何本あるか?とXMLに記述してある場合、 どのようにコーディングして取得と設定を行うのでしょうか? System.Xml.Linq等、色々あるみたいですがXMLは触れた事が無いので…。 お優しい方お教え下さい。

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

  • ベストアンサー
noname#251971
noname#251971
回答No.1

カテゴリと内容から、言語はVB.NETということですよね? 環境(バージョン等)についての情報が書かれていませんので、今であればVisualStudio2015の世代であろうものとして回答を記載します。 (C#党なので、VB.NETはどのバージョンでどの程度のサポートがあるのかあまり詳しくないというのもあります) .NETで任意の構造のXMLを扱うクラスとしては2種ありますが、現在であればLINQ to XML(System.Xml.Linq名前空間およびその関連)クラスのみを覚えれば良いと思います。 XPathを利用したいということで、System.Xml.LinqとSystem.Xml.XPathの名前空間をインポートして、質問文の内容であればたとえば以下のような形で属性値を取得することが出来ると思います。 Dim xmlPath = "Path/to/file.xml" Dim xmlDoc = XDocument.Load(xmlPath) Dim tarouPen = xmlDoc _ .XPathSelectElements("/ABC/tarou[@id='pen']") _ .Select(Function(node) CType(node.Attribute("value"), String)) _ .FirstOrDefault() ちなみに、XPathを使わずにLINQメソッドを利用してたとえば以下のような書き方もあります。(VBではC#に比べてラムダが美しく書けないのでXPathとどちらが便利か微妙ですが) Dim xmlPath = "Path/to/file.xml" Dim xmlDoc = XDocument.Load(xmlPath) Dim tarouPen = xmlDoc _ .Elements("ABC") _ .Elements("tarou") _ .Where(Function(node) CType(node.Attribute("id"), String) = "pen") _ .Select(Function(node) CType(node.Attribute("value"), String)) _ .FirstOrDefault() また、この回答の記載中に知りましたが、VB.NETでは「XML 属性軸プロパティ」という記法でLINQ to XMLに対する特別な記述も行えるようですね。 XPathを利用する版の例で、XML 属性軸プロパティと2015で追加された「?.」演算子も組み合わせたら以下のような感じにも書けるようですね。 Dim tarouPen = xmlDoc.XPathSelectElement("/ABC/tarou[@id='pen']")?.@value

directjpn
質問者

お礼

大変助かりました!!凄く勉強になります! 回答ありがとうございました!!!!!!!!

関連するQ&A