ひとモノBLOG

03 « 2017 / 04 » 05
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
profile
SHOO
  • SHOO
  • 機械系の学生。の割にプログラミングとかのほうが得意だったり。
  • RSS
links
BLOG内検索
Adds by DTI Blog

明日からスキーしてきます。内容とは関係ないけど。
2008/03/05(水) [01:08:22]

Tangoの新バージョンが登場。
詳細は以下から。

Tango 0.99.5 Jascha リリース

http://dsource.org/projects/tango/forums/topic/409
Tangoの最新版がリリースされました。
今回のバージョンからXMLの利用が可能となっています。

ためしにDOMのほうを使ってこんなコードを書いてみました。
import tango.text.xml.Document;
import tango.text.xml.XmlPrinter;
import tango.group.file;
import tango.group.stream;

void main()
{
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    // 生成のテスト
    
    // XMLドキュメント生成
    scope doc = new Document!(char);
    // 出力先はとりあえずバッファ
    // これをFileConduitとかにすればファイルに出力できる
    // Cout.stream なら標準出力に…
    scope buf = new GrowBuffer(4096, 1024);
    // 出力用のストリーム作成
    scope fmt = new FormatOutput(buf);
    // XMLのヘッダを作成
    doc.header;
    // この辺はドキュメントからぱくった。
    // 次のようになる。
    //
    // <element attrib1="value" attrib2="">
    //   <child>value</child>
    // </element>
    doc.root.element( null, "element" )
        .attribute( null, "attrib1", "value" )
        .attribute( null, "attrib2" )
        .element( null, "child", "value" );
    
    // 出力するときはXmlPrinterなるものを使用。
    scope dXmlPrinter = new XmlPrinter!(char);
    // 出力。
    fmt(dXmlPrinter(doc)).flush;
    
    
    
    // 読み込みのテストのために、
    // もう一個XMLドキュメント生成
    scope doc2 = new Document!(char);
    // バッファから書き込まれた文字列をすべて取り出す。
    // ぶっちゃけこれをするなら
    // auto str = dXmlPrinter(doc);
    // でOK
    auto str = cast(char[])buf.slice;
    // パーズ
    doc2.parse(str);
    
    
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    // アクセスのテスト。
    
    
    // アクセスの際にはそれぞれ foreach を書かなきゃいけない
    // …めんどい。
    // なんとかならんの?これ。
    bool dPassed = false;
    foreach (node; doc.query["element"]["child"])
    {
        assert( dPassed==false );
        dPassed = true;
        assert( node.name == "child" );
        assert( node.value == "value" );
    }
    assert( dPassed );
    
    // こんな関数を作ると楽にアクセスできるかも?
    // というか、 first, last, nth, opIndex のあたりは
    // アクセス利用でももっと簡単にしてほしいかも。
    alias Document!(char).Node Node;
    alias XmlPath!(char).NodeSet NodeSet;
    static Node getNode(NodeSet set, int idx=0)
    {
        foreach (node; set.nth(idx))
        {
            return node;
        }
        return Node.init;
    }
    auto node = getNode(doc2.query["element"]);
    assert( node.name == "element" );
    assert( node.getAttribute("attrib1").value  == "value");
    assert( node.getAttribute("attrib2").value  == "");
    node = getNode(doc2.query["element"]["child"]);
    assert( node.name == "child" );
    assert( node.value == "value" );
    
    // むしろ query からじゃなくて、 root からたどるべき?
    // でも、rootが "element" じゃないのか…?
    // とりあえず root.firstChild が一番最初のノードらしい
    node = doc2.root.firstChild;
    assert( node.name == "element", node.name );
    assert( node.getAttribute("attrib1").value  == "value");
    assert( node.getAttribute("attrib2").value  == "");
    //node = node.firstChild;
    //assert( node.name == "child", "なぜかダメ。" );
    //assert( node.value == "value", "なぜかダメ。" );
    
    version (FileOutput)
    {
        // ファイルに書き出す場合はこう。
        // ヘッダを書き込み。
        doc2.header;
        scope dXmlPrinter2 = new XmlPrinter!(char);
        scope strm = new TextFileOutput("test.txt");
        strm(dXmlPrinter(doc2)).flush;
    }
}
う〜ん、もうちょっとインターフェース良くなるといいんだけど…
とりあえずは、できるみたい。


rel="prev"<<DFL 0.9.7 リリース | ホーム |

この記事に対するトラックバック

この記事のトラックバックURL

-

管理人の承認後に表示されます

  • From: |
  • 2013/12/19(木) 14:04:11

この記事に対するコメント

この記事にコメントする

管理者にだけ表示を許可する
| HOME |