2017-01-10 14 views
-1

xmlファイルの子ノードから値を取得できないようです。私はすべてを試したような気がします。私が望むのは、xmlファイルのlocation子ノードのlatitudelongitudeの値を取得することだけです。私は間違って何をしていますか?おそらく、私はXMLの代わりにJSONを試してみるべきでしょう。XMLを使用してDescendants()またはElement()から値を取得できません

private void RequestCompleted(IAsyncResult result) 
{ 
    var request = (HttpWebRequest)result.AsyncState; 
    var response = (HttpWebResponse)request.EndGetResponse(result); 
    StreamReader stream = new StreamReader(response.GetResponseStream()); 

    try 
    { 
     XDocument xdoc = XDocument.Load(stream); 
     XElement root = xdoc.Root; 
     XNamespace ns = xdoc.Root.Name.Namespace; 

     List<XElement> results = xdoc.Descendants(ns + "GeocodeResponse").Descendants(ns + "result").ToList(); 
     List<XElement> locationElement = results.Descendants(ns + "geometry").Descendants(ns + "location").ToList(); 
     List<XElement> lat = locationElement.Descendants(ns + "lat").ToList(); 
     List<XElement> lng = locationElement.Descendants(ns + "lng").ToList(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("Error" + ex.Message) 
    } 
} 

また、ここでは、XML

<GeocodeResponse> 
    <status>OK</status> 
    <result> 
     <type>street_address</type> 
     <formatted_address>134 Gearger Circle, Lexington, KY, USA</formatted_address> 
    <geometry> 
     <location> 
      <lat>36.31228546</lat> 
      <lng>-91.4444399</lng> 
     </location> 
     <location_type>ROOFTOP</location_type> 
    </geometry> 
    <place_id>ChIJtwDV05mW-IgRyJKZ7fjmYVc</place_id> 
    </result> 
</GeocodeResponse> 

はゼロの数を示してデバッグ値です。それが何を意味するかわからない。私はちょうどlatlngの値が必要です。

+0

イメージにはjsonデータが含まれています。あなたの応答ストリームがXml – benPearce

+0

を返すと確信しています。私は間違った写真を含んだ。私はちょうどそれを固定した。 – daveskylark

+0

画像には、「」を囲む ''タグがあります。あなたはそれを取り除きましたか?どうやって? xDoc.Root.Nameとは何ですか? –

答えて

1

あなたの質問が正しく理解されている場合は、XML文書のlatlngのすべてのリストを探しています。あなたは文句を言わないDescendants

別の部分でXMLノードの値を取得するために階層にドリルダウンする必要が

XDocument xdc = XDocument.Load(stream); 
var AllLats = xdc.Descendants("lat"); 
var AllLong = xdc.Descendants("lng"); 

は、あなたのnamespace

<SOmeNS:address_component> 
ようなXMLのために含まれなければなられること nsです :

attachiせずに名前を持っていない要素のため

ありませんこの出力が必要かどうかを確認するには、スクリーンショットを開きます。

ScreenShot

+0

実際には 'location'の' lat'と 'lng'だけが必要です。すみませんでした。私は自分の質問の内容を変更しました。 – daveskylark

+0

あなたは、longとlatを含む場所のリストがほしいと言っています。それは...ですか ?? –

+0

そうだね。私は最終的に場所にちょうど 'lat'の値を含む変数を宣言します。また、位置に経度を含む変数 'lng'もあります。しかし、私はそれを行う方法や私のコードが機能していない理由を知らない。 – daveskylark

1

名前でに興味のある要素を取得します。最初の子が緯度で、最後の子が長いので、最初と最後の子ノードを取得します。

var sw = doc.Descendants("location"); 
var lat = sw.Descendants().First(); 
var lng = sw.Descendants().Last(); 
+0

実際には 'lat'と' 「場所」の1つです。すみませんでした。私は自分の質問の内容を変更しました。 – daveskylark

+0

@jedinerd編集編集をご覧ください。同じアイデアだが、単に「場所」を使う。コードの最後の3行を参照してください。 – CodingYoshi

+0

私はこれを試しましたが、 'XDocument'には' GetElementsByTagName'の定義がありません。理由は分かりません。 – daveskylark

1

コードが正しく動作するため、デバッガを使用してxmlが行にロードされていることを確認してください。

XDocument xdoc = XDocument.Load(stream); 

あなたのコードを実行するとき、私はnsで空の文字列を取得するか、コードからnsを削除してみてください。

XNamespace ns = xdoc.Root.Name.Namespace; 

下記のコードを使用してください。

List<XElement> lat = locationElement.Descendants(ns + "lat").ToList(); 
       List<XElement> lng = locationElement.Descendants(ns + "lng").ToList(); 

var latitudeval = lat[0].value; 
var longitudeval = lng[0].value; 
1
//XNamespace ns = xdoc.Root.Name.Namespace; 
    XNamespace ns = xdoc.GetDefaultNamespace(); 
0

私は私の問題を解決することができた唯一の方法は、JSON代わりにXMLのための要求を送信することでした。その後、Regexを使用して、応答の一部を<string>部分を削除することができました。これは完全に機能し、JSONは私の意見ではとにかともに作業するのが簡単です。

private void RequestCompleted(IAsyncResult result) 
{ 
    var request = (HttpWebRequest)result.AsyncState; 
    var response = (HttpWebResponse)request.EndGetResponse(result); 
    JObject jdoc = null; 

    Stream stream = response.GetResponseStream(); 

    try 
    { 
     StreamReader reader = new StreamReader(stream); 
     string text = reader.ReadToEnd(); 

     Regex rgx = new Regex("<.*\\>"); 
     string newResult = rgx.Replace(text, ""); 

     JObject json = JObject.Parse(newResult); 
     jdoc = json; 
     JArray results = (JArray)json["results"]; 

     if (results.Count == 0) 
     { 

     } 
     else 
     { 
      foreach(JObject obj in results) 
      { 
       string formattedAddress = (string)obj["formatted_address"]; 
       double lat = (double)obj["geometry"]["location"]["lat"]; 
       double lng = (double)obj["geometry"]["location"]["lng"]; 
      } 
     }      
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("Error" + ex.Message); 
    } 
} 
関連する問題