0

XMLファイルからデータをインポートして5Dマップに保存しようとしています

// declaration of the map
    map<char *, map<char *, map<char*, map<char *, map<char*, map<char*, char*, cmp_str>, cmp_str>, cmp_str>, cmp_str>, cmp_str>, cmp_str> XmlData;

私はRapidXMLパーサーをXML解析に使用しています

file<> xmlFile("jobs.xml");
xml_document<> doc;
doc.parse<0>(xmlFile.data());

xml_node<> *node = doc.first_node();
while(node != 0) {
    xml_node<> *child = node->first_node();
    while (child != 0)
    {
       xml_node<> *subchild = child->first_node();
       while (subchild != 0)
       {
           xml_node<> *subsubchild = subchild->first_node();
           while (subsubchild != 0)
           {
               xml_node<> *subsubsubchild = subchild->first_node();
               while (subsubsubchild != 0)
               {
                  // the error appears here
                  XmlData[node->name()][child->name()][subchild->name()][subsubchild->name()][subsubsubchild->name()] = subsubsubchild->value();
                  subsubsubchild = subsubsubchild->next_sibling();
               }
               subsubchild = subsubchild->next_sibling();
           }
           subchild = subchild->next_sibling();
       }
       child = child->next_sibling();
    }
    node = node->next_sibling();
}

すべてのノードを反復するには、5 つの while ループを使用する必要がありました

XML :

<Job>
    <UserJob>
        <RuleSet>
            <def>
                <Path>detection_c_new.dcp</Path>
                <WkspName>MyWS</WkspName>
                <UserName>Admin</UserName>
            </def>
        </RuleSet>
    </UserJob>
    <Scenes>
        <Scene1>
            <Info>
                <def>
                    <ID>0</ID>
                    <Name>Scene 1</Name>
                </def>
            </Info>
            <Layers>
                <Layer1>
                    <Index>0</Index>
                    <Name>Layer 1</Name>
                    <ImgPath>CTX_MEM_Detail.jpg</ImgPath>
                </Layer1>
            </Layers>
            <ExpItems>
                <ExpItem1>
                    <Name>MyStats1</Name>
                    <Driver>CSV</Driver>
                    <Type>1</Type>
                        <Path>CTX_MEM_Detail.csv</Path>
                </ExpItem1>
            </ExpItems>
        </Scene1>
    </Scenes>
</Job>

CentOS 6 で c++0x を使用して g++ を使用してコンパイルすると、次のエラーが発生します。

Job.cpp:133: error: no match for âoperator=â in â((std::map<char*, std::map<char*, char*, cmp_str, std::allocator<std::pair<char* const, char*> > >, cmp_str, std::all$
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_map.h:251: note: candidates are: std::map<_Key, _Tp, _Compare, _Alloc>& std::map<_Key, _Tp, _Compa$
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_map.h:266: note:                 std::map<_Key, _Tp, _Compare, _Alloc>& std::map<_Key, _Tp, _Compa$
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_map.h:286: note:                 std::map<_Key, _Tp, _Compare, _Alloc>& std::map<_Key, _Tp, _Compa$
4

1 に答える 1

1

char* はマップキーとして持つのはひどいものであり、おそらく値もそうです。

const char* を使用することもできます。キーは、リテラルのみなど、安定したものへのポインターを渡すことが絶対に確実だからです。

ベースラインの解決策では、文字列をキーとペイロードの両方として使用するため、問題も解消されると思います。最も可能性の高い直接の原因は、値が char* への変換を拒否することです。

于 2013-06-19T13:15:38.490 に答える