- PR -

xerces * c++ でのXML パース

1
投稿者投稿内容
harumaki
常連さん
会議室デビュー日: 2004/09/09
投稿数: 32
投稿日時: 2005-12-04 00:45
xerces * c++ でのXML パースの方法について教えていただけたらと思います.

<a>
<b>
<c>c1</c>
<d>
<e>e1</e>
<f>f1</f>
</d>
</b>
<b>
<c>c2</c>
<d>
<e>e2</e>
<f>f2</f>
</d>
</b>
<b>
<c>c3</c>
<d>
<e>e3</e>
<f>f3</f>
</d>
</b>
</a>

このようなデータをパースして各値を取得するプログラムはどう記述すればよいのでしょうか?

XMLPlatformUtils::Initialize();

XercesDOMParser parser;
parser.parse( "sample.xml" );
DOMDocument *doc = parser.getDocument();
DOMNodeList *nodeList = doc->getElementsByTagName("b");
for( int cnt = 0; cnt < nodeList->getLength(); cnt++ ) {
DOMNode node = nodeList.item(cnt);
}

これでタグb まではたどりつけていると思うのですが, c/d/e/f に対して
どうアクセスすればよいのか分かりません.
どなたかご回答頂けませんでしょうか。。。

[ メッセージ編集済み 編集者: harumaki 編集日時 2005-12-07 15:10 ]
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-12-04 23:59
http://xml.apache.org/xerces-c/apiDocs/classDOMElement.html
Functions introduced in DOM Level 1
getElementsByTagName
DOMElement木のpreorder横断の中でそれらに遭遇する順に、与えられたタグ名を備えたすべての子孫要素のDOMNodeListを返します。

ELEMENT に対しても getElementsByTagName は使えます。
harumaki
常連さん
会議室デビュー日: 2004/09/09
投稿数: 32
投稿日時: 2005-12-06 17:28
ご回答ありがとうございます.

そこでまた疑問なのです.
DOMNode をDOMElement でキャストするコードを散見するのですが,
nodeList.item(cnt); // 最初の投稿のソース
で取得されるDOMNode(親) をDOMElement(子) でキャストしてしまってよいのでしょうか?

この操作(キャスト)が理解できていないのが問題になっております。。。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-12-06 17:37
こんにちは。

引用:

harumakiさんの書き込み (2005-12-06 17:28) より:

そこでまた疑問なのです.
DOMNode をDOMElement でキャストするコードを散見するのですが,
nodeList.item(cnt); // 最初の投稿のソース
で取得されるDOMNode(親) をDOMElement(子) でキャストしてしまってよいのでしょうか?

この操作(キャスト)が理解できていないのが問題になっております。。。



(親)(子)とは、基底クラスと派生クラスのことですね?

おそらく、getElementsByTagNameで取得したDOMNodeなので、
DOMElementにキャストしても問題ないでしょうが、
(Elementをgetしたんですから)

ご心配ならばdynamic_cast(ダウンキャスト)を使用されては、いかがでしょうか?


[ メッセージ編集済み 編集者: Tdnr_Sym 編集日時 2005-12-06 17:41 ]
harumaki
常連さん
会議室デビュー日: 2004/09/09
投稿数: 32
投稿日時: 2005-12-07 15:30
Tdnr_Sym さん, ご回答ありがとうございます.

>(親)(子)とは、基底クラスと派生クラスのことですね?
そのつもりで書いてしまいました.
基底/ 派生が正しいです.

なるほど, 確かにDOMDocument.get "Element" ByTagName() ですね.
マニュアルの戻りの型しか意識しておりませんでした.

ダウンキャストで対処したいと思います.
1

スキルアップ/キャリアアップ(JOB@IT)