ホーム > デベロッパ > SophiaFramework > BREW C++ 逆引きコード集

BREW C++ プログラミング : SophiaFramework 逆引き FAQ・コード集

複数の DOM ノードを名前で管理する

SFXXMLNode::DOMNamedNodeMap クラスを使って、複数の DOM ノードをリストで名前します。

解析対象の XML 文書(file.xml)
<fruit>
    <name made="japan" date="2007-06-20"size="XS">apple</name>
</fruit>
SFXXMLNode::DOMNamedNodeMap クラスを使ったサンプルコード
SFCError error;             // エラー値
SFXXMLDOMParser parser;     // DOM パーサー
SFXAnsiString resultString; // 結果を格納する文字列

// file.xml に保存した XML 文書を解析する
if ((error = parser.Parse("/file.xml")) == SFERR_NO_ERROR) {
    // ルート要素を取得する
    SFXXMLDocumentPtr root = parser.GetDocument();   
    / ルート要素の最初の子要素 ( "fruit" 要素 ) を取得する
    SFXXMLNodePtr child = root->GetFirstChild();  
    // "fruit"要素の子要素 ( "name" 要素 )を取得する
    child = child->GetFirstChild();                

    // すべての Attribute ノードを取得し、名前で管理する
    SFXXMLNode::DOMNamedNodeMapPtr nodeMap = SFXXMLElementPtr(child)->GetAttributes();

    //  マップのノード数を表示する
    TRACE("%d",nodeMap->GetLength());  // 3

    for (int i = 0; i < nodeMap->GetLength(); i++) {
        // マップの index 番目の項目を取得する
        SFXXMLNodePtr node = nodeMap->Item(i); 
       // マップの index 番目の項目のノードの値を取得する
        resultString = node->GetNodeValue();   

        // 取得したノードの値を表示する
        TRACE("%s",resultString.GetCString()); // "XS" "2007-06-20" "japan"
    }
    
   / 名前により指定されたノード(  "date " )を取得する
    SFXXMLAttributePtr date = static_cast<SFXXMLAttributePtr>(nodeMap->GetNamedItem( "date "));
    // 名前により指定されたノード(  "date " )の値を取得する
    resultString = date->GetNodeValue();   
	
    // 取得したノードの値を表示する
    TRACE("%s",resultString.GetCString()); // "2007-06-20"
    
    // 名前で指定したノード( "made" )を削除する
    SFXXMLNodePtr remove = nodeMap->RemoveNamedItem("made");
    // ノード ポインターを削除する
    ::delete remove;
	
    //  マップのノード数を表示する
    TRACE("%d",nodeMap->GetLength());  // 2
    
    for (int i = 0; i < nodeMap->GetLength(); i++) {
        // マップの index 番目の項目を取得する
        SFXXMLNodePtr node = nodeMap->Item(i); 
        // マップの index 番目の項目のノードの値を取得する
        resultString = node->GetNodeValue();   

        // 取得したノードの値を表示する
        TRACE("%s",resultString.GetCString());   // "XS" "2007-06-20"
    }
    
    // 特定のノードをその nodeName 属性を使って追加する
    nodeMap->SetNamedItem(root->CreateAttribute("color", "red"));
    
    //  マップのノード数を表示する
    TRACE("%d",nodeMap->GetLength());   // 3
    
    for (int i = 0; i < nodeMap->GetLength(); i++) {
        // マップの index 番目の項目を取得する
        SFXXMLNodePtr node = nodeMap->Item(i); 
        // マップの index 番目の項目のノードの値を取得する
        resultString = node->GetNodeValue();   

        // 取得したノードの値を表示する
        TRACE("%s",resultString.GetCString());  // "XS" "2007-06-20" "red"
    }
}