XML

XMLの鬼門:処理命令

XMLを処理する上で普段めったにお目にかからないのが処理命令です. 普通オーサリングで意図的に処理命令を書く人はまずいらっしゃらないでしょう?ではどのような場面で処理命令は使われるのでしょうか? OxygenやXMetaLなんかのXMLエディタを使うとTrackin…

HTMLでXPathを使う.

ウェブスクレイピングという技術があるそうです.ウェブサイトから情報を抽出する技術のこと.TeraTailにVBAからMSXMLを使用してHTMLをパースし、XPathで必要な情報を取得したいという趣旨の投稿があありました.そもそもMSXMLでは入力がXHTMLでない限り(つ…

F#のmatch式

久しぶりにVisual Studioを立ち上げて、F#での要素+属性のマッチングを試してみました. この前Scalaでやってみた教訓は、 1.XMLパターンがあるが、どうもネームスペースがちゃんとサポートされていないみたい. 2.XMLパターンには属性までマッチングさ…

Scalaのmatch式(4)

要素+属性のマッチングに挑戦してみました.マッチングには要素の場合と同様に、case Elem(~)のコンストラクタパターンを使用します. object Elem extends Serializable http://www.scala-lang.org/api/current/index.html#scala.xml.Elem$ This singleto…

Scalaのmatch式(3)

Scalaのコンストラクタパターンでネームスペースを含む要素のマッチングがちゃんとできないものか試してみました.まず作ったのは次のようなプログラムです. import scala.xml.Elem import scala.xml.NamespaceBinding object matchTest { def main(args: A…

Scalaのmatch式(2)

ScalaでXMLリテラルを使ったmatch式を試してみました.作ったのは次のようなちょっと恣意的なテストプログラムです. def main(args: Array[String]): Unit = { val doc = <nsb:block xmlns:nsb="urn:block"> <nsi:inline xmlns:nsi="urn:inline1" seq="1">phrase1 <nsi:inline xmlns:nsi="urn:inline2" seq="2">phrase2 </nsi:inline> </nsi:inline> </nsb:block> val nodeS…

Scalaのmatch式(1)

最初にScalaのmatch式を見たいと思います.有名なMartin Odeskey教授は邦名「Scalaスケーラブルプログラミング(インプレス刊)」で次のように記しています. 「Scalaのmatch式を使えば、他の言語のswitch文と同じように、いくつかの選択肢(alternative)か…

VBチームのブログ(2)

VBチームのブログの言わんとするところは次のようなことではないかと考えられます. 1.XMLファイルをコピーする抽象クラスをつくる.XMLの構成要素を個別にコピーする処理はすべて実装する. 2.このクラスを継承した目的の処理を実装するクラスを作る.…

VBチームのブログ(1)

以前紹介しましたが、MicrosoftのVisual Basicの開発チームのブログに、VBでXMLを処理する一連のトピックが載っています.ファイルをコピーする、XSLTと同じような変換処理を記述するというサンプルもあり、なかなかおもしろく読めます. VB XML Cookbook ht…

プログラミング言語とネームスペース(6)

標準のScalaのネームスペースサポートは散々でした.Elemクラスにnamespaceというメソッドはあるのですが、QName(修飾名)を記述して絞り込む手段がなかったからです. それではScales XMLはどうでしょうか?私はScales XMLにはあまり詳しくありません.と…

プログラミング言語とネームスペース(5)

Scalaでネームスペースを使う例を紹介します. まずいままでVBやF#でネームスペースを扱うのにそれなりの「儀式」をしてきました.ところがScalaでは、 http://blogs.yahoo.co.jp/tnakita/14853232.html でネームスペースをつけたMusicLibraryNS.xmlを処理し…

プログラミング言語とネームスペース(4)

F#の例を紹介します.XPathを使用する場合はほとんどVBと同じです.XmlNamespaceManagerクラスを生成して、接頭辞とネームスペースを必要なだけ登録します.XmlNamespaceManagerクラスは、XPathSelectElementsメソッドを実行するときに指定します. open Sys…

プログラミング言語とネームスペース(3)

.netでVBを使う例です.最初はXPathを使用する例です. Imports System.Xml Imports System.Xml.XPath Module XPath2 Sub Main() Dim xpDoc As XPathDocument = New XPathDocument("MusicLibraryNS.xml") Dim xpNav As XPathNavigator = xpDoc.CreateNavigat…

プログラミング言語とネームスペース(2)

Javaのネームスペースの使い方の例です.JavaではネームスペースのハンドリングはNamespaceContextインタフェースをインプリメントしたクラスをXPathクラスに登録することで実現されます. Interface NamespaceContext http://docs.oracle.com/javase/7/docs…

プログラミング言語とネームスペース(1)

XMLを扱う言語にとってネームスペースはある場合には鬼門にもあたるような存在ではないかと思えます.例えばパーサーを作るのだったら <a xmlns="uri:xslt:testa"> <b xmlns="uri:xslt:testb"> <c xmlns="uri:xslt:testc"> text </c> </b> </a> とデフォルトネームスペースが要素a~cとナビゲートするのに従って変わってゆくのを管理しなければなりませ…

プログラミング言語とXPath(9) Scales XMLをつかってみる.

以前Scalaの標準のXMLサポートでは"\\"でXpathの"//"を表し"\"で"/"を表すというXPathライクな表記が出来ることを紹介しました.でもScalaですからこれらは、実はみんなメソッドです.Scales XMLの場合はどうなのでしょうか?以前の http://blogs.yahoo.co.j…

プログラミング言語とXPath(8) Scales XMLをつかってみる.

Scales XMLでXPathを試してみました.プログラムは以下のように超簡単なものです. package xmltest import scales.utils._ import ScalesUtils._ import scales.xml._ import ScalesXml._ import scales.xml.Functions._ import java.io._ import scalaz._ …

プログラミング言語とXPath(7) Scales XMLをビルドしてみる

前回Scalaの標準の実装ではXMLの処理が不便であるということを書きました.ScalaにはXMLの処理を意図した別の実装が存在します.その一つがScales XMLです. Scales Xml is an alternative library for XML usage in Scala https://code.google.com/p/scala-…

プログラミング言語とXPath(6) Scala

では期待のScalaはどうでしょうか?実はScalaにできることは、おおよそ以下のようなプログラムで示されることです. import scala.xml.XML import scala.xml.Elem object Main { def main(args: Array[String]) { val root = XML.loadFile("MusicLibrary.xml…

プログラミング言語とXPath(5) F#

.NETのVBをやったのでF#がどうなのか試しておきます.最初にXPathSelectElementsを使う例です.これは簡単でVBと同じです. open System.Xml.XPath open System.Xml.Linq [<EntryPoint>] let main argv = let xd = XDocument.Load("MusicLibrary.xml") (* XPathSelectEle</entrypoint>…

プログラミング言語とXPath(4)

.NETでLINQのXDocumentに対してXPathSelectElementsにXPath式を指定してノードを選択する例を示します.非常に単純でドキュメントノードに対してXPathSelectElementsを適用するだけです. Imports System.Xml.Linq Imports System.Xml.XPath.Extensions Modu…

プログラミング言語とXPath(3)

.NETでXPathを使うには、LINQ以前のSystem.Xml.XPath.XPathNavigatorクラスを使う方法と、LINQのXDocument, XElementに対してXPathSelectElementsなどのメソッドを使用する方法の二つがあるようです. XPathNavigatorは言ってみれば、PCのワープロやエディタ…

プログラミング言語とXPath(2)

最初はJavaです.JavaでXPathを使用する例はネット上で豊富に存在します.私が懐かしく見させていただいたのは、IBM developerWorks Japanの以下の記事です. Java XPath API Java プログラムから XML をクエリーする http://www.ibm.com/developerworks/jp/…

プログラミング言語とXPath (1)

Office2003はもうすぐサポート終了になるそうです.私のPCにはOffice2013も入っていますがOffice2003もまだちゃんと入っています.Office2003の例えばWord2003はMicrosoftにとって画期的な製品でした.何故かというとそれまでのバイナリーのネイティブフォー…

XMLファイルをコピーする(6)

最後の例は本命(?)のScalaです.XMLのロードとセーブが簡単になる分ぐっとコードが短くなります. import scala.xml.XML import scala.xml.Node import scala.xml.NodeSeq import scala.xml.Elem import scala.xml.Text object Main { def main(args: Arr…

XMLファイルをコピーする(5)

F#は2002年からMicrosoft ResearchのDon Symeらによって開発されたマルチパラダイム言語です.Visual Studioに載ったのは2010からとまだ新しいです.私はまったくの初心者ですが、書いてみるとけっこう面白いです.Amazonで本を探してみると、F#はScalaより…

XMLファイルをコピーする(4)

次は同じVisual Basicでも、LINQ(統合言語クエリ, Language INtegrated Query)for XMLを使ってみます.出力も「直に」タグを書き込んでいては芸がないので、XmlWriterクラスを使うようにします. Imports System.IO Imports System.Xml Imports System.Xml…

XMLファイルをコピーする(3)

こんどは.NETのSystem.Xml.XmlReaderを使ってVisual Basicでやってみます.プログラムは以下のようなものです.(あいかわらずエラー処理は全然やってありません.) Imports System.IO Imports System.Xml Module Main Sub Main() Dim xr = CreateXmlReader…

XMLファイルをコピーする(2)

最初はJava + SAX (Simple API for XML)でやってみます.プログラムは以下のようなものです.(エラー処理は全然やってありません.) import org.xml.sax.*; import org.xml.sax.helpers.*; import java.io.*; public class Main { public static void mai…

XMLファイルをコピーする(1)

復習と勉強がてらにXMLファイルをコピーするという単純な処理を様々な言語でどのように実現できるかやってみました. 前提として、XMLファイルはコメントや処理命令を含まないごく単純なものとします.ネームスペースも使用しません.今回使ったのはBeginnin…