ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月19日(火) 16:28

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 1 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2009年11月01日(日) 21:23 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
お住まい: 宮城県
XMLを扱う場合は、MSXMLのXmlDocument あたりを
利用することが多いと思います。

しかし
AB上からは、これら(COM?)の呼び方がイマイチ分からない/複雑。┐(-ε-)┌
というわけで、同じI/FのクラスをAB用に作成してみました。

XPathを使う必要性に迫られたので、その辺を中心に。
極力同じメソッド名&操作性にしているので、他の言語(VC++,VB,C#等)で
本来のMSXMLを利用する際も混乱しないと思います。

# あ、特殊記号「&'<>'」は内部で勝手にエンティティと変換します。
# なので、クラス越しにXMLを読み書きする際は、そのまま直に記号を扱えます。
# そこは本家MSXML利用より便利かも?

(※当方が必要とするメソッド/メンバしか実装/定義してませんのでアシカラズ)。

1.作成クラスの概要
2.クラスの定義(コード)


3.サンプル
3.1.追加ライブラリ不要版
※上記のクラス本体の定義は略してます。


3.2.AB淡幻ライブラリ利用版
※上記のクラス本体の定義は略してます。
コード:
#include <WSLib7_AB_Distrbution.sbp>

Dim objXmlDoc As WsAB_XmlDocument
Dim pobjXmlNode As WsAB_XmlNodePtr
Dim pobjXmlNode_Elem As WsAB_XmlNodePtr
Dim pobjXmlNode_Text As WsAB_XmlNodePtr

Dim s As String


'サンプル:XMLをテキストで設定して、XMLファイルへ出力する。
s = "<root><config><test>aaaa</test><test>bbbb</test></config>"
s = s + "<config><test>hoge</test></config></root>"
objXmlDoc.LoadXml( s )
objXmlDoc.Save( "dbg_0base.xml" )


'サンプル:XPathでノードを選択して、テキスト内容を書き換える。
'          その後XMLファイルへ出力する。
s = "/root/config/test"
pobjXmlNode = objXmlDoc.SelectSingleNode( s )
Msgbox 0, pobjXmlNode->FirstChild->Value(), "1st: "+s
pobjXmlNode->FirstChild->Value( "change" )
objXmlDoc.Save( "dbg_1st.xml" )


'サンプル:XPathでノードをテキスト判定つきで選択する。
s = "/root/config/test[ text()='hoge' ]"
pobjXmlNode = objXmlDoc.SelectSingleNode( s )
Msgbox 0, pobjXmlNode->FirstChild->Value(), "2st: "+s


'サンプル:選択したノードの一つ上の階層を選択する。
'          ⇒それを親として新規ノードを追加して、XMLファイルへ出力する。
s = "../"
pobjXmlNode = pobjXmlNode->SelectSingleNode( s )
pobjXmlNode_Elem = objXmlDoc.CreateElement( "add_node" )
pobjXmlNode_Text = objXmlDoc.CreateTextNode( "追加したノード" )
pobjXmlNode_Elem->AppendChild( pobjXmlNode_Text )
pobjXmlNode->AppendChild( pobjXmlNode_Elem )
objXmlDoc.Save( "dbg_2nd.xml" )


'サンプル:XPathでノードを配列的に選択して、エレメント名を変更する。
'          その後XMLファイルへ出力する。
s = "/root/config[2]"
pobjXmlNode = objXmlDoc.SelectSingleNode( s )
Msgbox 0, pobjXmlNode->Name(), "3rd: "+s
pobjXmlNode->Name( "variable" )
objXmlDoc.Save( "dbg_3rd.xml" )


End




4.動作確認環境
ActiveBasic: 4.24.00
OS: Windows XP SP3



以上ー。





2009.11.08
存在しないXPathに対して、最後に存在した上位ノードを返すバグ(本来はNULL応答が正しい)を修正
2009.11.29
ノード削除メソッドにバグ(終端のノードを削除時に前後接続が不正になる)があったので修正。
2011.10.15
偶にアプリケーションエラーで落ちるバグを修正(null終端の直後のアドレスへの違反アクセスが発生することがあった)。
2011.11.25
コメント内部に「<」があると(=javascriptとか)ノードを取得できないバグを修正。





P.S.   コメントがあちこち抜けてますが、気力があればそのうち追記します。。。
P.S. x2 一応、InsertAfter()、InsertBefore()、InnerText()、
      SelectSingleNode()でのContains()サポートあたりは追加したいと思ってますが、、、
      これも気力があればm(_ _)m
P.S. x3 大元のMSXMLの呼び出すパターンの投稿は大歓迎です♪

# コミュニティ復活おめでとうございます。
# ・・・しかし動作が重いっすねぇ。。。(^^;)


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 1 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean