Hatena::ブログ(Diary)

Web系がおもしろい。

2010-08-23

LinqでXML使ってみる

| 00:20 | LinqでXML使ってみる - Web系がおもしろい。 のブックマークコメント

今日は奇跡の定時退社だったので、Linqやってみました!

id:shingotada さんから教えていただいたのに、はてなダイアリー市民権限はく奪される直前って…


とりあえず要素ゲット

前々回のラノベXML使おうと思ったんですが、ちょっとXML階層的にも物足りないので、お天気Webサービス仕様 - Weather Hacks - livedoor 天気情報

を使わせていただいてます。livedoorいい仕事してます!


「using System.Xml.Linq;」を忘れずにー。

// データの読みとり
string xmlPath = @"http://weather.livedoor.com/forecast/webservice/rest/v1?city=104&day=tomorrow";

// ルート要素の取得
XElement xelm = XElement.Load(xmlPath);
// XElement xelm = (XDocument.Load(xmlPath)).Root; // これでも同じ

// title要素の取得
Console.WriteLine(xelm.Element("title").Value);

// 回りくどい方法でdescription要素取得
var fuga = (from p in xelm.Elements("description")
            select p).Single();
Console.WriteLine(fuga.Value);

// pinpoint要素内の情報を取得
fuga = (from p in xelm.Element("pinpoint").Elements("location")
            where p.Element("title").Value == "松山市"
            select p).Single();
Console.WriteLine(fuga.Element("link").Value);

ソース中のコメントの誤りを修正しました。XDocumentのロード→ルート要素の取得

感想

初めてLinq使ったんですが、便利ですね!

DOM使うとGetElementsByTagNameとか出てきてすごく冗長なので、とても書きやすかったです!

本当はXPathも盛り込もうと思ったんですが、うちのVisualStudioは2008だったので、XPathSelectElementに対応してないみたいなんですよね。残念。。

XDocumentをXmlDocument(DOM)に変換できるなら…とかも考えたんですが、XDocument→XmlDocumentはめんどくさいようですね。

XDocument と XmlDocument



あと紹介だけ

Webスクレイピングってのがあります。

知らなかった人は夢が広がるかも。

僕もC#ではやったことないので、そのうち以下のサイト様参考にやってみようと思います!

C#でスクレイピング - DENKEN

2010-07-21

C#のXmlDocument使ってみる

| 00:45 | C#のXmlDocument使ってみる - Web系がおもしろい。 のブックマークコメント

最近、業務ではC#でローカルアプリケーションを作ってるので、Web系から疎遠になってしまってしまってるesperiaさんです。こんばんは。。

仕事なので放り出すわけにゃいかない、じゃぁC#楽しんでいこー!って話ですね!


というわけでDOM操作します!

C#でもXML使うこと多いですものね!


こんなXML読み取る

DTDをわざわざ書いている理由は、ATTLISTでid属性がID型であることを明示しないと、getElementByIdが使えないからです。

DTDを書かなかった場合は、getElementByIdの値は常にnullとなります。

XmlDocument.GetElementById(String) Method (System.Xml) | Microsoft Docs

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE lightNovel [
	<!ELEMENT lightNovel (book*)>
	<!ELEMENT book (title, subtitle?, writer)>
	<!ATTLIST book id ID #REQUIRED>
	<!ELEMENT title (#PCDATA)>
	<!ELEMENT subtitle (#PCDATA)>
	<!ELEMENT writer (#PCDATA)>
]>
<lightNovel>
	<book id="LN0001">
		<title>あそびにいくヨ!2</title>
		<subtitle>作戦名『うにゃーくん』</subtitle>
		<writer>神野オキナ</writer>
	</book>
	<book id="LN0002">
		<title>土属性はダテじゃない!</title>
		<writer>葉原鉄</writer>
	</book>
</lightNovel>

まずDOM作成

「using System.Xml;」を忘れずにー。

private void button1_Click(object sender, EventArgs e)
{
	// パスの入力
	string xmlPath = "C:\\hoge.xml";
	if (!System.IO.File.Exists(xmlPath))
	{
	    // ファイルが見つからなかったときの処理とか
	}

	// まずDOMインスタンス作成!
	XmlDocument helpXml = new XmlDocument();
	helpXml.Load(xmlPath);

	// メソッド使ってみる!
	MessageBox.Show("GetElementById してみる!");
	XmlElement eBook = helpXml.GetElementById("LN0001");
	MessageBox.Show(eBook.InnerXml);

	MessageBox.Show("GetElementsByTagName してみる!");
	XmlNodeList eTitleList = helpXml.GetElementsByTagName("title");
	for(int i=0; i<eTitleList.Count; i++)
	    MessageBox.Show(eTitleList[i].InnerXml);

	MessageBox.Show("さっき取得したtitle要素の、それぞれの親要素のidを求めてみる!");
	for (int i = 0; i < eTitleList.Count; i++)
	    MessageBox.Show(eTitleList[i].ParentNode.Attributes["id"].InnerText);
}

でもやっぱり

そろそろJavaScriptが書きたいです!今はSVGもアツいですね!

第3回 少し高度なSVG:スタートアップ SVG|gihyo.jp … 技術評論社


追記:ATTLISTによってID型であることを明示すればいいだけなので、DTDの部分を以下の内容だけにしても動くようですね。

<!DOCTYPE lightNovel [
	<!ELEMENT book (title, subtitle?, writer)>
	<!ATTLIST book id ID #REQUIRED>
]>

XmlDocument.Loadより後に、ファイルパスのチェックが入っていたのを修正しました。

shingotadashingotada 2010/07/24 11:08 .net だったら linq とか便利ですよねー。
xml だろうが、sql だろうがなんでも情報取れます。

esperiaesperia 2010/07/24 15:22 えっ、LINQってそんなになんでもオッケーなんですか!?
XMLも読めるのは知りませんでした。。
情報ありがとうございます!