C++でXML(主にxerces)やろう!
■ このスレッドは過去ログ倉庫に格納されています
スレ無いしサイト少ないので立ててみる いらなかったらサゲまくってください >>379 えと、比較ではなくて、Windowsのタスクマネージャでメモリ消費量を眺めつつ 378を実行すると、メモリ消費量が単調増加していき、最終的にはメモリ不足で落ちる、 という感じです。 ついしんです。 for(;;) { elem = doc->createElement(tag_name); elem->release(); } でも、起きました... Xercesのソースを少し追ってみました。 release()を行うと、Documentオブジェクトの再利用バッファにElementが退避されます。 退避されたオブジェクトは、次回に同型のオブジェクトを割り当てる際に、再利用されます。 確かにrelease()で解放したオブジェクトは、次回のcreateElement()の 呼び出しで再利用されているようです。しかし、Elementのデータメンバは 管理されておらず、コンストラクタでNULLが上書きされ、結果としてデータメンバは メモリリークになります。 では手を加えてこのデータメンバを手動で解放しよう...と考えたいところですが、 オブジェクトの割り当てにはDocument独自のヒープ管理によりなされており、 このヒープ管理機能には、個々の割り当て結果を解放する機能がないように 見えます。(一括の解放はある) 恐らくフラグメントの処理等を省いて高速化を図っているんじゃないかと 思うんですが、このあたりの事情はどこかに書いてありますか? (あるなら、お客さんには「そういうものなんだ」と言って逃げます) FAQに再利用の件が少し書いてあるのを見つけましたが、リークが起きる事象 そのものの記述ではなく、いまいちな感じです。 やっぱり素人にはJavaの方が楽だな..... と思った。 そのまま納品しました。 ようやく年が越せそうだ... XMLパースプログラムを自分で作るのは難しいのですか? 簡単ですよ ただ、仕様把握するのが面倒なだけで 難しいというか楽しい部分が少ないので誰もやりたがらない XMLPlatformUtils::Terminate() 呼び出したら cloneNode() とかで作成したオブジェクトも勝手に削除してる? アプリの終了時に Terminate() 呼び出すから、 実行中に破棄できるオブジェクトを破棄し忘れてても気づかない・・・ ・Xerces(SAX,DOM) http://xml.apache.org/xerces-c/ マルチプラットホーム(win32,linux) windowsの場合、xerces-c_2_6.dll(2,304KB)が必要。 ・msxml() http://www.microsoft.com/japan/msdn/xml/default.asp MSXML4まで出てる。 MS独自の仕様があるっぽ ・expat/expatpp(SAX) http://expat.sourceforge.net/ 早いっぽい ・tinyXML() http://sourceforge.net/projects/tinyxml/ 小さいっぽい ・MiX() http://mix.sourceforge.jp/ このスレに作者がいる予感 速度: expat > msxml = xerces = tinyXML = MiX 機能: xerces > msxml > expat = tinyXML = MiX 容量: msxml = expat = tinyXML = MiX > xerces 安定: xerces = expat = tinyXML > msxml > MiX OS : xerces > msxml = expat = tinyXML = MiX このスレを一通り読んで適当に書いてみた。 改変してー >>392 別に何か作ろうってスレじゃないと思われ C++でXMLを使う事について ライブラリとかバグとかを話し合うスレと思われ そしてネタ切れしてると思われ とりあえず>>390 改変でまとめようと思われ wiki建てた方がいいのかな 個人的に思ったXML(parser)使う利点 ・HTMLぐらい皆がわかる簡単な書式ってそうない。 ・簡単なCSVでもパーザ書くのめんどくさいし。 ・属性等に名称つけてるので可読性が高い。(CSVは、何行目が何ーとか覚えてないと駄目) ・解析後に独自のバイナリに落としときゃそれなり早いはず。 ・ツリー状(親子関係)にデータをもてるので幅広く活用できる ・ゲーム系だとかなり使えるんじゃないの 3Dは、もちろん 基本的なアクションやシューティングって親子関係多いし。 別に親子関係無しでもいいと思う。 弾幕記述言語にXML使ってあり、 libBulletMLにtinyXML使ってるっぽい。 http://shinh.skr.jp/libbulletml/ 食える文字コード Xerces: ICUと組んでとにかくいろいろ msxml: MSの各種コードページいろいろ(?) expat: UTF-8 tinyXML: UTF-8 MiX: std::basic_string<> (?) ※適当な調査です tinyXMLのlibファイル VC6,Releaseで118KBだった 小さい There are four built-in encodings in Expat: * UTF-8 * UTF-16 * ISO-8859-1 * US-ASCII >>396 Mixの方がそれより小さいんじゃないの? >>390 一番重要なライセンスについて知りたいよう >>402 expatとlibxmlはMITライセンス。他は使わないので知らん。 MixとtinyXML容量比較しようと 適当にMiXの全ソース VC6のstatic libプロジェクトにぶっこんでビルドしたけど エラー出た。66個 おしまい。 template使いまくりで非常にC++らしく SAX,DOM両方出来るらしいのは素敵なんだが。 tinyXMLは、 DOMしか出来ないっぽいが、 VC6のlib生成用のプロジェクト最初からついてて template使わない単純なクラスばっかり。 ヘタレプログラマーには、導入しやすいかと。 >>403 C++版のexpatppってのがあるらしい libxmlはCだね。 まあC++でも使えるからいいんじゃね? tinyXML遅いっぽ ttp://www.radiumsoftware.com/0303.html#030308 Cだと Parsifalってのもあるっぽいね http://www.saunalahti.fi/ ~samiuus/toni/xmlproc/ 速度はやっぱり expatだが libxmlはHTMLParserやシンプルなhttp/ftpクライアントとかXMLSchema/RelaxNG validationやlibxsltと連携できるのが利点かな? windows上だとiconvやzlibもおまけで付いてくるので少し配布サイズがでかくなるが。 XMLって <root att0="a", att1="b" /> じゃなく <root> <att0>a</att0> <att1>b</att1> </root> って書かないと駄目なんですか? Elements使えば解析できるが >>410 テクニカルにはどっちもOK。 理念的には、というか普通はどっちも×。 <root att0="a", att1="b" /> ↑ XMLをバイナリーデータに落とし込む良い方法はありますか? ttp://www-6.ibm.com/jp/developerworks/xml/040903/j_x-trans1.html 1つだけ情報見つけたけどなんかもっと分かりやすくて C++で使えるツールとか無いかなぁと。 1バイトずつ読み込んで全ての最上位ビットを1にすればよろし。 >>419 ごめん。そうだね。 1バイトずつ読み込んで全ての最上位ビットを反転すればよろし。 に訂正。 >XML Binary Infoset (XBIS)プロジェクト ↑これ使った人いる? >プレーンテキストの XML と XBIS エンコーディングした XML と >gzip 圧縮した XML に対するテスト結果によると、 >XBIS を使えば処理時間と文書サイズ両方が小さくできるのに対し、 >gzip 圧縮を用いれば文書サイズが大幅に小さくできる代わりに処理時間が >増えるということです。 って事らしいが。 読みやすきゃ形式どうでもいいんじゃない? 不安ならHTML真似すれば SOX(Simple Outline XML)流行らないね C++でXML書かせたいんですけどいいライブラリないですか? WinだったらMSXML以外を選択するメリットが分らないんだけど。 XercesとMSXMLの違いを教えてぽ。 MSXMLってXPathもXSLTも(1.0だけど)XMLSchemeも実装していて、まじ便利じゃん。 独自拡張って言っても、細かい制御なり設定/取得できていい感じじゃん。 XSLTでもJavaScriptを拡張言語指定できて便利じゃん。(早く2.0を実装しろと) パフォーマンスも外部参照やValidation組んでいる割にはかなり早いし、軽いじゃん。 くだらない::CoInitialize(VOID)書かなきゃいかんのは、デメリットかな? スマートポインタと相性悪いんだYO! 個人的にはRELAXを実装して欲しいところ。 >>431 具体的にどうありえねーのか教えてくれろ? ついでにXercesの素晴らしさも教えて欲しいです。 いまXerces-C++使うプログラム書いてんだけどよ、なんか馴染まないんだぁよ。 msxmlでrelaxngの実装されることなんてありえね、と言っているのではないかな。431じゃないがたぶん。 >>433 ありえて欲しいところw VCのAdd-Inで組んで広めれば、簡単に広がりそうなもんだが。 そういったシェア拡大の為の宣伝は下手だな<relaxng 誘導されてきました。 知ってる人いたら教えてけろ 407 名前:デフォルトの名無しさん 投稿日:2005/02/02(水) 23:26 COMはありですか? VC6 でMSXML使ってます。 XML形式の書き出しは何とかできたんだけど、出力が1行になっちゃいます。 複数行に出力されるようなフラグとかあるんですか? 現状 <?xml 略?> <root><a><b>text</b></a></root> 理想 <?xml 略?> <root> タブ1個<a> タブ2個<b>text</b> タブ1個</a> </root> ぐ、ぐぅ分からん。 段差をつけるには単純に空白を追加しろって書いてあるような気ガス もしくは VCでやるには XSLT 使わないとダメってことかなぁ >>435 DOMいじって再帰で階差をつけるよりは>>436 のサイトのXSLTを読み込んで 変換かけたほうがパフォーマンス的に良い場合が多いし、楽。(データ量が多いほどXSLT使った方が早い) もともとXML的にはトリミング無い方が正しい(?自信無し)訳だし、確認だけなら>>438 の言う通り IEで見ればいいと思う。 それ以外だと、UTF-8が素で読み込めないという欠点はあるが、Pythonの標準DOMにprettyXML関数がある。 俺はそれを使って、データの確認をしている。 >>435 ちなみにDOM使って再帰で階差をつけるのはそんなに簡単じゃない。 >>436 のサイトではSAX使っている例があるが、SAXならクソ簡単。 >>439 誤 トリミング 正 インデント みんな色々さんく。 とりあえず今回は時間もないんでDOMのままでいっとく 時間が空いたらSAXやってみるかな XSLTなら <xsl:output method="xml" /> <xsl:output indent="yes" /> で済むからめっちゃ楽だよね。 MiXバグだらけ、という話だけど XMLファイルの読み込み程度なら耐えられるのかな? それともそれすらままならない? >443 >339,342,343-346 ここらへんの話だね。 しょうじきSTLの扱いが怪しいところが何箇所かあった。 内部処理にexpatを使ってくれるようになったらいくらか…、 って、expatラッパーならほかにあるしなぁ……。 <xml> <text prop="a">AAAA</text> <text prop="b">BBBB</text> </xml> XPathで2番目のノードを指定する場合って /xml/text[2] なんだけど、 これ以外にプロパティで選択する方法ってある? ニュアンスはこんな感じ。 /xml/text:prop="b" >445 XPathには詳しくないが、ググったら一発で見つかったんで答えてみるテスト。 /xml/text[@prop="b"] または /xml/text[attribute::prop="b"] ttp://www.doraneko.org/xml/xpath10/19991116/Overview.html#location-paths >>444 結局、時間がなかったのであの時はMiX使ったけど、 次の機会には絶対別のパーサを使おうと決めました。 正直お勧めはしません。 >>206 でも話題にあがってるけど、レスした人がいないようなんで。 XMLのパスに全角文字が含まれていると正しく実行されない。 (DLL内で永久ループにはまる?) 回避法ないですか? すまん。DLL内で永久ループ〜ってのは俺のプログラムがあほなせいだった。 m_pParser->parseURI(lpszFileName); ここでNULLが返ってくるだけだな。 ためしにMSLCh* に変換しても×だった #include <Windows.h> ↑Xercesでこれやったら、コンパイルエラーになるんだけど、どうして? Windows + VisualC++2003 + STLPortで コンパイルが通らない。 STLPortが駄目なんですかね? UNIXユーザーはアプリケーションはソースから コンパイルして使うのが一般的と聞いたんだけど こういう場合どういった対処をするもんなんですか? 1.アプリ製作元が確認したビルド環境に合わせる 2.ソースを改変してコンパイルが通る様にする 3.バイナリ版を使う Xercesで DOMWriter *pxWriter = static_cast<DOMImplementationLS*>(pxImpl)->createDOMWriter(); pxWriter->setEncoding( _UNICODE("Shift_JIS") ); pxWriter->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true); LocalFileFormatTarget target( _UNICODE("tekitou.xml") ); pxWriter->writeNode(&target, *pxDoc); ってやると、勝手に空白二つのインデントが入ったXML文書が出力されます。それをタブにする方法はありませんか? http://neta.ywcafe.net/000339.html 天気予報をXMLで提供すると気象庁が発表してから半年が経った 実は2004年の11月には既に気象庁がこんなプレスリリースを出している。 府県天気予報・府県週間天気予報を新しい形式(XML形式)で提供します。 ◎:平成16年12月から追加して発表するもの (XML形式で提供します。気象庁HPでも12月から掲載します。) しかし発表で予告された12月1日からもう半年以上を経た2005年7月現在、 気象庁のwebサイトにはXML形式のデータなどどこにも見当たらない。 なお、お察しのとおり、財団法人 気象業務支援センターも 財団法人 日本気象協会も 気象庁の官僚の天下り先である。 タクシーで帰れるなんてなんて贅沢なんだと思ってしまったw 仕事で忙しいか。 接待したり、飲み会したり、勉強会と称して雑談したり、 有り余るゼニの使い道を考えたり ゴルフの練習をしたり 大忙し ビルドできないんだけど・・・・ XERCESCROOT=c:/usr/xerces-c-src_2_7_0/src/xercesc >runConfigure -pcygwin -cgcc -xg++ >make すっと、 AbstractDOMParser.cpp が、dom/impl/DOMAttrImpl.hpp が見つからないっつってとまる。 そのファイルちゃんとあるし、frameworkディレクトリとかは問題なくコンパイルとおっている んだけど、なんでですか? あれ、cygwinにxerces ついてるじゃん。 こっちつかえばいいや。失礼しました。 ザーシーズ。 紀元前5世紀前半、アケメネス朝ペルシャの王位についていたクセルクセス(Khshaiarsha)王の 名がギリシア語経由で欧米に伝ったもの。ドイツ語や、英語ではXerxesと書く。 のち、フランスの昆虫学者が、サンフランシスコ半島に生息していた絶滅種の蝶に、この大王の 名を付けた。このクセルクセスのフランス語形Xerces、蝶の名が、XMLパーサxercesの元ネタ。 >>462 本当なんだかネタなんだかよくわからん情報をありがとう。 Xercesやexpatの存在を最近知って とりあえずイジってみたいというレベルの人向けの 入門的サイトってありますか?できれば日本語で。 大人しく本買うかライブラリ付属の説明を頑張って読むほうが良さげ 俺は↓の読んだけど意見分かれるかもね C++によるXML開発技法 ttp://www.amazon.co.jp/exec/obidos/ASIN/4894714140/250-1021717-6488243 xerces とか libxml って、そのままだとかなりでかいライブラリなんだが、 サブセットで xxx.dll サイズ小さくしたやつってない? >>472 おま、dll って、windows 限定でいいんなら始めから素直に msxml 使っとけよw インストールされているバージョンに若干気をつける必要があるが、 最近の windows なら標準で添付されてんだから dll の大きさなんか気にする必要なし。 ( 最近の windows じゃなくても最近の IE が入ってればおk ) 最近はライブラリで提供されているのにDLLを使うメリットを感じないんだが。 ゴメソ 別にwindows限定な話じゃないつもりだったんだけど、dll っていっちゃって失敗したw いや、フリーでソースも公開されてるので、linuxでもwindowsでも使えて、サブセットを 選べて、場面に応じてコンパクトなライブラリとしてビルドできたらいいななんて思ったんです。 >>473 知りませんでした。ちょっと調べてみまつ Thx!! ただ、本当は xerces の config オプションとかでサブセットでライブラリを作るかフルセット で作るかをビルド時に選択できたりするとうれしいかなと。 小さめのライブラリがいいんならもともと小さいのを使っておればいいだろ expatとかさ まあDOMもXPATHも使えんがw 小さいサイズのライブラリを使うためにライブラリの種類を変えないと いけない(使い方も微妙にかわる)ってのが嫌なんだろう XMLを使うったって、 ちょっとプログラム上でApacheやRealServerのconfを 書き換えたいという程度の時もあるんだな。 夜中にトップページを「また明日」に自動的に変更するとかさ。 そういうちょっとした作業にはMiXでさえうざいぐらい大きい。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる