XPathNavigator の代わりに LINQ to XML を使用することを強くお勧めします。私の経験では、これにより XML クエリが簡単になります。この場合、何が問題なのか正確にはわかりませんが、代わりに LINQ to XML スニペットを考えてみます。
using System;
using System.Linq;
using System.Net;
using System.Xml.Linq;
class Test
{
public static void Main(string[] args)
{
using(WebClient webclient = new WebClient())
{
webclient.Proxy = null;
string locationXml = webclient.DownloadString
("http://maps.google.com/maps/api/geocode/xml?address=1600"
+ "+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false");
XElement root = XElement.Parse(locationXml);
XElement result = root.Element("result");
Console.WriteLine(result.Elements("address_component")
.Where(x => (string) x.Element("type") ==
"administrative_area_level_1")
.Select(x => x.Element("short_name").Value)
.First());
Console.WriteLine(result.Elements("address_component")
.Where(x => (string) x.Element("type") ==
"administrative_area_level_2")
.Select(x => x.Element("long_name").Value)
.First());
}
}
}
これはコード1の続きですが、個人的には XPath よりも正しく処理する方が簡単だと思います。
編集:明らかに長いにもかかわらず、XPath を使用するよりもこのようなコードを一般的に好む理由について、もう少し詳しく説明する価値があると思います。
C# プログラム内で XPath を使用すると、2 つの異なる言語が使用されますが、制御できるのは 1 つだけです (C#)。XPath は文字列の領域に追いやられます。Visual Studio は XPath 式に特別な処理を与えません。XPath 式であることを理解していないため、役に立ちません。Visual Studio が XPath を認識していないわけではありません。Dimitre が指摘しているように、C# ファイルではなく、XSLT ファイルを編集している場合、エラーを完全に見つけることができます。
これは、ある言語が別の言語に埋め込まれていて、ツールがそれを認識していない場合に当てはまります。一般的な例は次のとおりです。
コードが別の言語内でデータとして提示されると、2 次言語はそのツールの利点の多くを失います。
XPath(またはSQL、または正規表現など)を独自のツール(おそらく同じ実際のプログラム内ですが、別のファイルまたはウィンドウ内)に引き出して、あらゆる場所でコンテキストスイッチを切り替えることができますが、これは難しくなります-長期的にはコードを読む。コードが書かれただけで、その後に読み取られることがない場合は、それで問題ないかもしれませんが、後でコードを読み取れるようにする必要があります。
上記の LINQ to XML バージョンでは、純粋なデータ (要素の名前など) にのみ文字列を使用し、コード (メソッド呼び出し) を使用して、「指定された名前の要素を検索する」または「このフィルターを適用する」などのアクションを表します。私の見解では、それはより慣用的な C# コードです。
明らかに、他の人はこの視点を共有していませんが、私がどこから来たのかを示すために拡張する価値があると思いました.
もちろん、これは厳密で迅速なルールではないことに注意してください...場合によっては、XPath、正規表現などが最適なソリューションです。この場合、XML よりも LINQ を使用したいと思います。それだけです。
1もちろん、各呼び出しを 1 行にまとめることもできConsole.WriteLine
ましたが、SO に水平スクロールバーを含むコードを投稿するのは好きではありません。上記と同じインデントを使用して正しい XPath バージョンを記述し、スクロールを回避することは、依然としてかなり厄介であることに注意してください。
Console.WriteLine(nav.SelectSingleNode("/GeocodeResponse/result/" +
"address_component[type='administrative_area_level_1']" +
"/short_name").InnerXml);
一般に、長い行は、スタック オーバーフローよりも Visual Studio の方がうまく機能します...