XMLの取得について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
真由美

XMLの取得について

#1

投稿記事 by 真由美 » 15年前

先日、VC++でのXMLについて質問させて頂きました者です。
とあるXMLからname要素を全て取り出す為に
下記の様に記載しているのですが上手く出来ません・・・。
どこがどの様に間違えているのか指摘頂けないでしょうか?
//////////////////////////////////////////////////
ソース
//////////////////////////////////////////////////

System::Xml::XmlDocument^ doc = gcnew System::Xml::XmlDocument();
doc->Load("ここにURLを入れております。");

System::Xml::XmlNodeList^ node = doc->SelectNodes("/user");
String^ textBoxStr = "";
Xml::XmlNodeList^ itemNode = doc->SelectNodes("/user");

for each(Xml::XmlElement^ item in itemNode){
String^ str = ""; 

Xml::XmlNode^ xeTitle = item->SelectSingleNode("name"); 
    if(xeTitle == nullptr || String::IsNullOrEmpty(xeTitle->InnerText)) 
}
//////////////////////////////////////////////////
XML
//////////////////////////////////////////////////

<?xml version="1.0" encoding="UTF-8" ?> 
- <users type="array">

    - <user>
      <id>1121</id> 
      <name>あああ</name> 
      </user>
      
    - <user>
      <id>1282</id> 
      <name>いいい</name> 
      <screen_name>ううう</screen_name> 
      </user>
      
    - <user>
      <id>1860</id> 
      <name>えええ</name> 
      <screen_name>おおお</screen_name> 
      </user>
      
    - <user>
      <id>9563</id> 
      <name>かかか</name> 
      </user>
  </users>

Justy

Re:XMLの取得について

#2

投稿記事 by Justy » 15年前

>下記の様に記載しているのですが上手く出来ません・・・
 XPath式は理解していますか?

XPath 構文
http://msdn.microsoft.com/ja-jp/library ... S.80).aspx

XML Path Language (XPath)
http://www.w3.org/TR/xpath/

XMLパス言語 (XPath)
http://www.doraneko.org/xml/xpath10/199 ... rview.html

@IT:XML文書内の位置を正確に指し示すXPath
http://www.atmarkit.co.jp/fxml/rensai/r ... xml08.html


 "/user"で取得できるノードはルートが userであるノードだけです。
 しかし提示された xmlのルートは usersで userではありません。
 ルートusers直下の userノードを指定するのでれば "/users/user"とする必要があります。


>とあるXMLからname要素を全て取り出す為
 無条件に nameノードだけを取り出すのであれば、 "//name"として下さい。

真由美

Re:XMLの取得について

#3

投稿記事 by 真由美 » 15年前

ご回答ありがとうございます。
ご丁寧にリンクまでありがとうございます。

理解度は30%程度です。
何となくと言いますか雰囲気しかわかっておりません。
申し訳御座いません・・・。
教えて頂きましたリンクを見てみたのですが
やはり何となくしか理解できません・・・。
ソースを書きながら勉強していきます。

こういうことでしょうか?
System::Xml::XmlNodeList^ node = doc->SelectNodes("/users/user");
String^ textBoxStr = "";
Xml::XmlNodeList^ itemNode = doc->SelectNodes("/users/user");

for each(Xml::XmlElement^ item in itemNode){
String^ str = "";

Xml::XmlNode^ xeTitle = item->SelectSingleNode("//name");
if(xeTitle == nullptr || String::IsNullOrEmpty(xeTitle->InnerText))
continue;
str += "title : " + xeTitle->InnerText + "\r\n";
}
this->textBoxXML->Text = textBoxStr;

現在このようなソースになっているのですが値が取れておりません・・・。

Justy

Re:XMLの取得について

#4

投稿記事 by Justy » 15年前

>何となくと言いますか雰囲気しかわかっておりません
 ここは頑張ってもらうしかないですね。


>こういうことでしょうか?
 何故 SelectNodes("/users/user")が2回あるのかは置いておくとして、
多分 xmlの処理的には合っています。
 ただ、最後のテキストボックスに流し込んでいる textBoxStr変数に入っている文字列が
“空”なだけじゃないでしょうか。

 textBoxStr変数は最初に ""で初期化した後、何もしないまま textBoxMLに流し込んでいるように
見えますよ。

 デバッガでそれぞれの値がどうなっているか確認して見て下さい。

真由美

Re:XMLの取得について

#5

投稿記事 by 真由美 » 15年前

ご回答ありがとうございます。

すみません、初歩的なミスです。
下記の様に記載して値を取得することは出来ました。
しかし全て同じ行の値を引っ張ってきてしまっております・・・。
配列みたいに[i]の様に書いてみたのですが上手く取得できませんでした。
これを取得することができないでしょうか・・・。

また問題が御座いましたtry-catchを使うと
warning C4101: 'ex' : ローカル変数は 1 度も使われていません。
という警告が出てしまいます。
これを解除する方法はないでしょうか? ※#waning~とかは書かずに
try{
                     doc->Load(url);

                     String^ textBoxStr = "";
                     Xml::XmlNodeList^ itemNode = doc->SelectNodes("/users/user");
                     
                     String^ str = ""; 
                     for each(Xml::XmlElement^ item in itemNode){
                         
                         Xml::XmlNode^ xeTitle = item->SelectSingleNode("//name"); 
                         if(xeTitle == nullptr || String::IsNullOrEmpty(xeTitle->InnerText)) 
                             continue; 
                         str += xeTitle->InnerText + "\r\n"; 
                     }
                     this->textBoxXML->Text = str;
                 }catch(Exception^ ex){
                     MessageBox::Show("IDかパスワードが違います。","警告");
                 }

Justy

Re:XMLの取得について

#6

投稿記事 by Justy » 15年前

 やはりきちんと XPath式を理解するのが先決でしょう。
 
 //が先頭についた場合、ルートとその全ての子孫ノードの要素すべてにマッチします。
 つまり本来複数ヒットする可能性があるわけですが、SelectSingleNode()を使っているので
一番最初のノードだけが返ります。
 その為、毎回同じノードを差しているわけです。

 今回の場合単純に各 /users/userノードの子である nameタグを拾えればいいので
for each内の SelectSingleNodeのところを
 "//name" -> "name"
として下さい。



>という警告が出てしまいます
 使わない変数なら書かなければいいのです。
 これは C/C++と同じです。
[color=#d0d0ff" face="monospace]
catch(Exception^)[/color]

真由美

Re:XMLの取得について

#7

投稿記事 by 真由美 » 15年前

ご回答ありがとうございました。
どちらも問題なく出来ました><

XMLについてはまだ分からないところが多いので調べさせて頂きます。
今回も本当にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る