ページ 11

VC++でのXMLの読み込み

Posted: 2010年3月18日(木) 16:12
by 真由美
VC++でXMLの読み込みをし、テキストボックスに表示したいです。
XMLの読み込みまでは出来たようなのですがこれをテキストボックスに出力する方法がわかりません・・・。

タイトルや日時だけを取得して表示を行いたいです。
どの様にすればよいかご教授願えないでしょうか?

またBASIC認証が必要なRSSフィードがある場合
これでも行えるのでしょうか?

Re:VC++でのXMLの読み込み

Posted: 2010年3月18日(木) 18:47
by バグ
テキストボックスに表示したいだけならば、テキストとして読み込んでTextプロパティにセットしてやるだけだと思いますが…?

Re:VC++でのXMLの読み込み

Posted: 2010年3月18日(木) 19:00
by 真由美
>>バグ様
ご回答ありがとうございます。
すみません・・・そのテキストとしての読み込み方がわからないのです・・・。
XMLを読み込むにはXMLクラスを使わなければならないと書いてあったので
調べてみたのですが良く理解できませんでした。

Re:VC++でのXMLの読み込み

Posted: 2010年3月18日(木) 19:46
by バグ
あぁ、そういう事ですか。
たしかに、XML形式でシリアライズされたオブジェクトを復元したい場合はXMLシリアライザークラスを使用しますが、テキストとして読み込みたいなら、テキストファイルを読み込むのと同じ方法でいけるはずですよ。

Re:VC++でのXMLの読み込み

Posted: 2010年3月18日(木) 21:30
by 真由美
ご回答ありがとうございます。
すみません・・・。テキストを読み込む方法では出来ませんでした。
何か間違えているのでしょうか?
private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
                 String^ url = "http://headlines.yahoo.co.jp/rss/rps_dom.xml";
                 //url = "test.txt";

                 System::IO::StreamReader^ sr = gcnew System::IO::StreamReader(url,System::Text::Encoding::GetEncoding(932));
                 sr->ReadLine();
                 while(sr->ReadLine() != nullptr){
                     this->textBox1->Text += sr->ReadLine() + "\r\n";
                 }
                 sr->Close();

                //try{}catch(Exception^ ex){}
                /*
                 System::Xml::XmlDocument^ doc = gcnew System::Xml::XmlDocument();
                 doc->Load(url);
                 */
                 //this->textBox1->Text = "ココ";
             }

Re:VC++でのXMLの読み込み

Posted: 2010年3月18日(木) 22:50
by Justy
 xmlの中身が判っているのであれば、XPath式で直接指定して取得するのが楽でしょう。
 
 最初のコードで doc->Load(url) が成功したなら
 doc->SelectNodes("/rss/channel/item");
 で、アイテム一覧 (XmlNodeList)が取得できるはずです。

 あとは、取得した一覧(XmlNodeList)から を各々(XmlElement)を調べて、
SelectSingleNodeメソッドで titleとか pubDateのノードを捕まえ、InnerTextプロパティを参照すれば
お望みのテキストが拾えます。

 ちなみに Basic認証を行う場合は
[color=#d0d0ff" face="monospace]
System::Xml::XmlDocument^ doc = gcnew System::Xml::XmlDocument();
System::Xml::XmlResolver^ resolver = gcnew System::Xml::XmlUrlResolver;
resolver->Credentials = gcnew System::Net::NetworkCredential("id","pass");
doc->XmlResolver = resolver;
doc->Load(url);
[/color]

のように XmlResolverを XmlDocumentにセットすればでアクセスできるはずです。

Re:VC++でのXMLの読み込み

Posted: 2010年3月19日(金) 02:08
by 真由美
ご回答ありがとうございます。
すみません。
調べてやってみたのですが値を取得できません・・・。
日時のpubdateだけでも取得しようとしたのですが上手くいきません・・・。

this->textBox1->Text = doc->SelectSingleNode(doc->SelectNodes("/rss/channel/item")->ToString());

Re:VC++でのXMLの読み込み

Posted: 2010年3月19日(金) 02:31
by 真由美
連レス失礼します。

String^ url = "http://headlines.yahoo.co.jp/rss/rps_dom.xml";
System::Xml::XmlDocument^ doc = gcnew System::Xml::XmlDocument();
/* BASIC
System::Xml::XmlResolver^ resolver = gcnew System::Xml::XmlUrlResolver;
resolver->Credentials = gcnew System::Net::NetworkCredential("id","pass");
doc->XmlResolver = resolver;
*/
doc->Load(url);
System::Xml::XmlNodeList^ node = doc->SelectNodes("/rss/channel/item");

現在はこのように書いておりますがココからどのように取得すればよいのかがわかりません・・・。

Re:VC++でのXMLの読み込み

Posted: 2010年3月19日(金) 02:37
by Justy
 ざくっとサンプルを書いてみました。
 解説は No:49408を参照して下さい。
 
[color=#d0d0ff" face="monospace]
try
{
String^ url = "http://headlines.yahoo.co.jp/rss/rps_dom.xml";
System::Xml::XmlDocument^ doc = gcnew System::Xml::XmlDocument();
doc->Load(url);

String^ textBoxStr = "";
Xml::XmlNodeList^ itemNode = doc->SelectNodes("/rss/channel/item");
for each(Xml::XmlElement^ item in itemNode)
{
String^ str = "";
Xml::XmlNode^ xeTitle = item->SelectSingleNode("title");
if(xeTitle == nullptr || String::IsNullOrEmpty(xeTitle->InnerText))
continue;
str += "title : " + xeTitle->InnerText + "\r\n";

Xml::XmlNode^ xeLink = item->SelectSingleNode("link");
if(xeLink == nullptr || String::IsNullOrEmpty(xeLink->InnerText))
continue;
str += "link : " + xeLink->InnerText + "\r\n";

Xml::XmlNode^ xeDate = item->SelectSingleNode("pubDate");
if(xeDate == nullptr || String::IsNullOrEmpty(xeDate->InnerText))
continue;
str += "date : " + xeDate->InnerText + "\r\n";

textBoxStr += str;
}
this->textBox1->Text = textBoxStr;
}
catch(...)
{
}
[/color]

Re:VC++でのXMLの読み込み

Posted: 2010年3月19日(金) 15:28
by 真由美
Justy 様
ご回答ありがとうございました><
出来ました!!ありがとうございます。

いつもお名前をみるのですが
Justy 様は何でもわかる素晴らしい技術者ですね・・・。