11-DOM XML

RSS1.0?のXMLをDOMで読み込んでみます。
XMLのサンプルは右下の[RSS]アイコンから見ることができるものとほぼ同じです。
ローカルのXMLファイルを読み込んでます。

PHP編

全部タグ名で検索してもいいんだろうけど、
なんか重そうなので、child_nodesとか使ってみました。
どないなんやろう?

PHPマニュアル(DOM XML)

★ソース

<?php

if(! $dom = domxml_open_file(dirname($_SERVER['SCRIPT_FILENAME']) . '/rss.xml')){
	die('RSSファイルが見つかりません。');
}

echo "<table border=\"1\">";

//ルートエレメント
$root_el = $dom -> document_element();
//itemタグのエレメント
$item_els = $root_el -> get_elements_by_tagname('item');

foreach($item_els as $item_el){
	
	//itemタグ内の子ノード
	$nodes = $item_el -> child_nodes();
	foreach($nodes as $node){
		//ノードの種類がエレメントのもの
		if($node -> node_type() == XML_ELEMENT_NODE){
			//タグ名から変数に代入
			switch($node -> tagname()){
				case 'title' :
					$title = $node -> get_content();
					break;
				case 'link' 
					$link = $node -> get_content();
					break
				case 'date' :
					$date = substr($node -> get_content(), 0, 10);
					break;
			}
		}
	}
	//表示
	echo "<tr>";
	echo "<td>$date</td><td>";
	echo "<a href=\"$link\">$title</a></td>";
	echo "</tr>";
}
echo "</table>";
?>

★結果

2005-05-07test?
2005-05-02Photo?
2005-05-02Photo/200503?
2005-04-28Oracle × SQL Server のSQL比較メモ
2005-04-28MyBooks
2005-04-28Books
2005-04-26ソフトウェア開発技術者試験自己採点用
2005-04-20資格試験
2005-04-18.NET
2005-04-18ADO.NETメモ
2005-04-16RSS?
2005-04-15PHP
2005-04-14Java
2005-04-14Java/ひとりごと-200501?
2005-04-06.NET/ひとりごと-200501?

.NET編

.NETでXMLをDOMで扱うには、System.Xml.XmlDocument?を使います。
どの言語でもほとんど一緒なので、どれかを覚えてしまえば、やりやすいですねー。
結果もPHP編と同じです。

<%@ Page Language="C#" %>
<%@ import Namespace="System.Xml" %>
<%@ import Namespace="System.Data" %>
<script runat="server">

private void page_load(Object sender, EventArgs e){
	//XMLファイル読み込み
	XmlDocument doc = new XmlDocument();
	doc.Load(System.IO.Path.GetDirectoryName(Request.PhysicalPath) + "\\index.xml");
	
	//itemエレメント検索
	XmlNodeList item_els = doc.GetElementsByTagName("item");
	
	//データテーブル作成
	DataTable dt = new DataTable();
	dt.Columns.Add(new DataColumn("date"));
	dt.Columns.Add(new DataColumn("title"));
	dt.Columns.Add(new DataColumn("url"));
	
	//itemタグ
	foreach(XmlNode item_el in item_els){
		//データ列?作成
		DataRow dr = dt.NewRow();
		
		//itemタグ内の子ノード
		XmlNodeList nodes = item_el.ChildNodes;
		foreach(XmlNode node in nodes){
			//ノードの種類がエレメントのもの
			if(node.NodeType == XmlNodeType.Element){
				//タグ名から内容を取得
				switch(node.Name){
					case "title" :
						dr["title"] = node.InnerText;
						break;
					case "link" :
						dr["url"] = node.InnerText;
						break;
					case "dc:date" :
						dr["date"] = node.InnerText.Substring(0, 10);
						break;
				}
			}
		}
		//データ列に追加
		dt.Rows.Add(dr);
	}
	//データテーブルをバインド
	DataGrid1.DataSource = dt;
	DataGrid1.DataBind();
}

</script>
<html>
<head>
	<title>DOM XML</title>
</head>
<body>
<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" ShowHeader="False">
	<Columns>
		<asp:BoundColumn DataField="date" />
		<asp:HyperLinkColumn DataNavigateUrlField="url" DataTextField="title" />
	</Columns>
</asp:DataGrid>
</body>
</html>

ASP編

MSXML2.DOMDocumentを使うと、XPathが使えます。
なんかちょっと関数名とかが違う気がします。

<%
Option Explicit

Dim dom, result, item_els, item_el, node
Dim title, link, date

Set dom = Server.CreateObject("MSXML2.DOMDocument")
result = dom.load(Server.MapPath("rss.xml"))
If Not result Then
	Response.Write "RSSファイルが見つかりません。"
	Response.End
End If

Response.Write "<table border=""1"">"

Set item_els = dom.selectNodes("rdf:RDF/item")
For Each item_el In item_els
	For Each node In item_el.childNodes
		Select Case node.nodeName
			Case "title"
				title = node.text
			Case "link"
				link = node.text
			Case "dc:date"
				date =Mid(node.text, 1, 10)
		End Select
	Next
	Response.Write "<tr>"
	Response.Write "<td>" & date & "</td>"
	Response.Write "<td><a href=""" & link & """>" & title & "</a></td>"
	Response.Write "</tr>"
Next

Response.Write "</table>"
%>

JavaScript

★HTML

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<script language="JavaScript" type="text/javascript" src="rss.js"></script>
<style type="text/css">table, th, td{border:1px solid #ccc;}</style>
</head>
<body>
<table>
<thead><th>日付</th><th>タイトル</th></thead>
<tbody></tbody>
</table>
</body>
</html>

★rss.js

window.attachEvent('onload', loadEvent);

function loadEvent(e){
	//HTML内の<tbody>タグ
	var tbody = document.getElementsByTagName('tbody')[0];
	
	//domオブジェクト作成
	var domXml = new ActiveXObject("Microsoft.XMLDOM");
	domXml.async = false;
	domXml.load('rss.xml');
	
	//itemタグ
	var itemNodes = domXml.getElementsByTagName('item');
	for(i=0; i<itemNodes.length; i++){
		var nodes = itemNodes[i].childNodes;
		var title, link, date;
		for(j=0; j<nodes.length; j++){
			switch(nodes[j].tagName){
				case 'title' : title = nodes[j].firstChild.nodeValue; break;
				case 'link'  : link = nodes[j].firstChild.nodeValue; break;
				case 'dc:date'  : date = nodes[j].firstChild.nodeValue; break;
			}
		}
		tbody.appendChild(createTr(title, link, date));
	}
}
function createTr(title, link, date){
	//アンカー
	var src = document.createAttribute('href');
	src.nodeValue = link;
	var a = document.createElement('a');
	a.setAttributeNode(src);
	a.appendChild(document.createTextNode(title));
	
	//セル1
	var td1 = document.createElement('td');
	td1.appendChild(document.createTextNode(date.substr(0, 10)));
	
	//セル2
	var td2 = document.createElement('td');
	td2.appendChild(a);
	
	//行
	var tr = document.createElement('tr');
	tr.appendChild(td1);
	tr.appendChild(td2);
	return tr;
}

感想・質問等どうぞ



Tag: Tips PHP .NET JavaScript


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-05-27 (木) 19:52:40 (726d)
.NET Ajax AmazonWebServices Android C# C++ CMS Cacoo DB Exam Generics Java JavaScript Local Oracle PHP Perl Photo Programming Pukiwiki Python Qt Review Ruby SQLServer Seasar Software Tips Tool VB WebService Windows WindowsMobile XHTML XML XMLMaster XSLT game pdf wkhtmltopdf