MSXML3.0で
IXMLDOMDocumentPtr pXMLDOMDoc;
pXMLDOMDoc.CreateInstance(__uuidof(DOMDocument));
pXMLDOMDoc->put_async(VARIANT_FALSE);
pXMLDOMDoc->validateOnParse = FALSE;
pXMLDOMDoc->load( _variant_t("XMLドキュメントのパス") );
としてXMLドキュメントを読み込み、属性が一致したノードを削除したいです。
例:xml
<root>
<category name='1'>
<item>
車
</item>
</category>
<category name='1'>
<item>
バイク
</item>
</category>
<category name='2'>
<item>
自転車
</item>
</category>
<category name='2'>
<item>
徒歩
</item>
</category>
</root>
上記のxmlからcategoryのname属性が1のものを削除し
下記のように変換したいです。
<root>
<category name='2'>
<item>
自転車
</item>
</category>
<category name='2'>
<item>
徒歩
</item>
</category>
</root>
No.3ベストアンサー
- 回答日時:
>removeAllメソッドがありませんでした
そんなことはないはずです。
以下のMSのサイトでMSXML3以降で(C/C++で)使えると書いてあります。
http://msdn.microsoft.com/library/default.asp?ur …
参考URLによると
Applies to
IXMLDOMSelection
と書いてありますから
IXMLDOMSelection
を使う必要があります。(メンバーにremoveAllがあります)
selectNodesからIXMLDOMSelectionをセットするサンプルが以下にあります
http://msdn.microsoft.com/library/default.asp?ur …
この回答への補足
自分ではMSXML3を使用しているつもりでしたが、実は
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" rename_namespace("MSXML") rename("EOF", "EndOfFile")
#import "msxml.dll"
using namespace MSXML;
としておりMSXML2.0を使用していたようです。
そこで
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" rename_namespace("MSXML2") rename("EOF", "EndOfFile")
#import "msxml3.dll"
using namespace MSXML2;
としたのですが
IXMLDOMSelection pXMLDOMSel;
と定義すると
プロジェクトのパス\ファイル名\ファイル名.cpp((211) : error C2259: 'IXMLDOMSelection' : 抽象クラスあるいは構造体のオブジェクトが宣言されています。
というエラーと
プロジェクトのパス\ファイル名\ファイル名.cpp(211) : warning C4259: 'long __stdcall IDispatch::GetTypeInfoCount(unsigned int *)' : 純粋仮想関数は定義されていません。
c:\program files\microsoft visual studio\vc98\include\oaidl.h(2697) : 'GetTypeInfoCount' の宣言を確認してください。
プロジェクトのパス\ファイル名\ファイル名.cpp(211) : warning C4259: 'long __stdcall IDispatch::GetTypeInfo(unsigned int,unsigned long,struct ITypeInfo ** )' : 純粋仮想関数は定義されていません。
c:\program files\microsoft visual studio\vc98\include\oaidl.h(2700) : 'GetTypeInfo' の宣言を確認してください。
プロジェクトのパス\ファイル名\ファイル名.cpp(211) : warning C4259: 'long __stdcall IDispatch::GetIDsOfNames(const struct _GUID &,unsigned short ** ,unsigned int,unsigned long,long *)' : 純粋仮想関数は定義されていません。
c:\program files\microsoft visual studio\vc98\include\oaidl.h(2705) : 'GetIDsOfNames' の宣言を確認してください。
プロジェクトのパス\ファイル名\ファイル名.cpp(211) : warning C4259: 'long __stdcall IDispatch::Invoke(long,const struct _GUID &,unsigned long,unsigned short,struct tagDISPPARAMS *,struct tagVARIANT *,struct tagEXCEPINFO *,unsigned int *)' : 純粋仮想関
数は定義されていません。
または
プロジェクトのパス\ファイル名.cpp(211) : warning C4259: 'long __stdcall MSXML2::IXMLDOMNodeList::raw_reset(void)' : 純粋仮想関数は定義されていません。
プロジェクトのパス\ファイル名\debug\msxml3.tlh(588) : 'raw_reset' の宣言を確認してください。
プロジェクトのパス\ファイル名\ファイル名.cpp(211) : warning C4259: 'long __stdcall MSXML2::IXMLDOMNodeList::get__newEnum(struct IUnknown ** )' : 純粋仮想関数は定義されていません。
プロジェクトのパス\ファイル名\debug\msxml3.tlh(589) : 'get__newEnum' の宣言を確認してください。
プロジェクトのパス\ファイル名\ファイル名.cpp(211) : warning C4259: 'long __stdcall MSXML2::IXMLDOMSelection::get_expr(unsigned short ** )' : 純粋仮想関数は定義されていません。
プロジェクトのパス\ファイル名\debug\msxml3.tlh(4151) : 'get_expr' の宣言を確認してください。
という警告が連発してしまいます。
何が原因なのでしょうか?
BLUEPIXYさんにはお世話になりっぱなしです。
感謝してます。
BLUEPIXYさんへは無理でも僕の知ってることで助かる人もいると思うので見習ってレスを入れようと思いました。
連結の方はxsl関数のdocument()を使い出来ました。
そこで削除は<xsl:script>でやろうと考え直していたのですが、
どうやら名前空間
http://www.w3.org/TR/WD-xsl
が<xsl:output>等と干渉するらしく
削除はやはりDOMを使うしかないと思っていた矢先でした。
MSDNは昨日調べたのですが、XMLまで辿り着いてMSXML4.0以外の所を探していてReferenceを見つけることが出来ませんでした。
MSDNはもう少し入りやすければいいのですが、慣れるしかないのでしょうね(苦笑
早速試してみます!
No.4
- 回答日時:
>警告が連発してしまいます。
実際に試していないのでなんですが
http://www.utj.co.jp/xml/dev/dom/dxdom1_1.html
http://www.utj.co.jp/xml/dev/dom/dxdom2_1.html
が参考になるような気がします
この回答への補足
レスを付ける場所を間違えてしまいました。
ありがとうございます、一応自己解決しました。
IXMLDOMSelection *pIXMLDOMSelection=NULL;
と宣言することでエラー、警告ともでなくなりました。
c2259というエラーコードをgoogleで検索すると
オーバーライドと純粋関数というキーワードに突き当たりました。
上記の書き方との繋がりがいまいちつかめてないので、
もう少し調べてみたいと思います。
上記のサイト勉強になりました。
defaultではXSLPatternとなっているのですね。
それとIXMLDOMDocument2でないとXPathが使えない
ほんと勉強になります。
No.2
- 回答日時:
こんにちは、ちょっと反則なんですが、
http://okweb.jp/kotaeru.php3?q=1637728
がもう締め切られちゃったので、こっちに書きます。
今日、ウロウロしてたら、原因と対策を思いつきました。
それは…
<xsl:text>-</xsl:text>
<xsl:text>,</xsl:text>
のように、地の部分に書き込むんじゃなくて、xsl:textエレメントを使うということです。
最初のvalue-of以降の地の部分に書き込みがあるので、以降の改行とかタブがそのまま使われるのだと思います。
っていうかもう試してみましたがうまくいきます!
この回答への補足
上記の件解決しました。
IXMLDOMSelection *pIXMLDOMSelection=NULL;
サンプルを真似したら出来ました、調べていくとオーバーライドと純粋仮想関数というキーワードに行き当たりました。 今から勉強してみます。
出来ました、こんな親切にして頂けるなんて感激です。
言葉でありがとうございますと伝えたいです。
地の部分に文字が書いてあるのを認識して
改行等が有効になっていたのですね。
タブ、スペース、改行すべて無視してくれるようになりました。
ありがとうございました。
No.1
- 回答日時:
setProperty("SelectionLanguage", "XPath");
して
selectNodes("//category[@name='1']");
して
removeAll();
すればいいです。
*
Jscriptでのサンプル
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");
var selectNodes;
xmlDoc.setProperty("SelectionLanguage", "XPath");
xmlDoc.async = false;
xmlDoc.load("move.xml");
if (xmlDoc.parseError.errorCode != 0) {
var myErr = xmlDoc.parseError;
WScript.Echo("error:" + myErr.reason);
} else {
selectNodes = xmlDoc.selectNodes("//category[@name='1']");
selectNodes.removeAll();
xmlDoc.save("out.xml");
}
色々面倒くさいのでCでのサンプルではないですが、やることはほぼ同じだと思います。
この回答への補足
その後C++で試行錯誤したのですが、
selectNodes = xmlDoc.selectNodes("//category[@name='1']");
は出来たのですが、removeAllメソッドがありませんでした
ので以下のように変えたのですが駄目でした。
IXMLDOMNodePtr pXmlNode;
IXMLDOMNodeListPtr pXmlNodeList;
long lNum = 0;
pNodeList = pXMLDOMDoc->selectNodes("//category[@name='1']");
pNodeList->get_length(&lNum);
for(long lCount= 0; lCount < lNum; lCount++){
pNodeList->get_item(lCount, &pXmlNode);
pXMLDOMDoc->removeChild(pXmlNode);
}
pXMLDOMDoc->save(xmlの保存先のパス);
やりたいことは、DB上の在庫データ(正確には少し違うのですが)を毎日XMLドキュメントとして保管し
1昨日分のデータと本日分のデータを結合して1つのXMLドキュメントにします。
1日分のデータは前1日分のデータを持っているので、
結合の際に前1日分のデータにして出力します。
[例]
前日分のデータ(9/11, 9/12)
本日分のデータ(9/12, 9/13)
必要なデータは
前日分のデータ(9/12)+本日分のデータ(9/12, 9/13)
を結合します。
結合しておいてXSLで省く(こちらはやった事があります)という様に方向転換しようかと思うのですが、
A:
<root>
<move>
<category name='2'>
<item>
自転車
</item>
</category>
<category name='2'>
<item>
徒歩
</item>
</category>
</move>
</root>
B:
<root>
<move>
<category name='1'>
<item>
車
</item>
</category>
<category name='1'>
<item>
バイク
</item>
</category>
</move>
</root>
を結合するにはどうしたらよいのでしょうか?
できればCでの情報が少なくて困ってるので、Cの情報を希望します。
ありがとうございます。
参考にさせて頂き早速やってみます。
せっかく教えて頂いたので、他の方のためにもCで完成させて、ソースを掲載させてから締切りさせて頂きたいと思います。
大変参考になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(ネットショッピング・通販・ECサイト) このサイトは詐欺サイトですか? 2 2022/10/11 00:05
- その他(ネットショッピング・通販・ECサイト) コスプレサイトについてです https://shop11.mvreklama.com/categor 1 2022/09/30 06:04
- HTML・CSS cssが効かなくて困ってます 1 2023/01/01 23:57
- MySQL mysqlで INSERT と SELECTの用途は 1 2022/04/01 00:45
- 経済 法人税は上げた方がいいですか? 6 2023/07/05 09:02
- 英語 下記の英語は正しいですか? 2 2022/07/04 16:38
- 政治 参政党をどう思いますか? 12 2023/07/12 18:25
- カスタマイズ(車) クルマのシート交換をすると、クルマの乗り味は変化しますか? 8 2023/02/03 22:23
- 政治 維新の会の胡散臭さと言えば何ですか? 2 2023/07/22 13:08
- 政治 公明党が憲法改正を止めているんでしょうか? 9 2023/07/05 09:13
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】NEW演歌
【大喜利】 若い人に向けたことは分かるけど、それはちょっと寄せ過ぎて変になってないか?と思った演歌の歌詞
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
忘れられない激○○料理
これまでに食べたもののなかで、もっとも「激○○」だった料理を教えて下さい。 激辛、でも激甘でも。 激ウマ、でも激マズでも。
-
おすすめのモーニング・朝食メニューを教えて!
コメダ珈琲店のモーニング ロイヤルホストのモーニング 牛丼チェーン店の朝食などなど、おいしいモーニング・朝食メニューがたくさんありますよね。
-
ギリギリ行けるお一人様のライン
おひとり様需要が増えているというニュースも耳にしますが、 あなたが「ギリギリ一人でも行ける!」という場所や行為を教えてください
-
VB6.0でDOMを使用してノードを削除したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
動的な構造体配列の初期化
-
concat関数内でのシングルクォ...
-
4バイトを10進数に変換する方法
-
CPUの考え方を教えてください ...
-
ルート要素ノードが2個ある場合?
-
VBSでxmlの値を書き換えたい
-
複数のマックPCによる数値計算...
-
Excel-VBAでXMLの複数ノードの...
-
VBSでXMLを読込、検索結果をテ...
-
特殊記号が勝手にエスケープさ...
-
XMLで要素が記述された順番に意...
-
タグの有無の判定
-
XMLファイルの作り方がわかりま...
-
SNMP リンクダウンとノードダ...
-
同じタグ名の項目取得
-
XML同じ名前の要素を自動で集約...
-
XML、XSLTの適応エラー(IEから...
-
excelにてweb関数を使い、webデ...
-
VBAでXMLを出力するプログラム...
-
昔Winnyってありましたけど、あ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
4バイトを10進数に変換する方法
-
VB.NETで最後フォのフォ...
-
動的な構造体配列の初期化
-
concat関数内でのシングルクォ...
-
XMLのエラーコードの意味が理解...
-
MSXMLを使ってノードを削除した...
-
Math.sqrt(Math.pow(canvas.wid...
-
CPUの考え方を教えてください ...
-
バッチファイルでテキストファ...
-
SNMP リンクダウンとノードダ...
-
ルート要素ノードが2個ある場合?
-
東芝のDynabookなのですがアン...
-
XMLで要素が記述された順番に意...
-
XMLファイルの作り方がわかりま...
-
昔Winnyってありましたけど、あ...
-
XML、XSLTの適応エラー(IEから...
-
同じタグ名の項目取得
-
タグの有無の判定
-
XPathで途中に名前空間が設定さ...
-
あるノードリストに、特定の名...
おすすめ情報