2016-05-02 14 views
0

XMLファイルには、以下のような数千のノードが含まれている可能性があります。XMLファイル内のノードを最も効率的に見つける方法(C++)

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <node> 
     <id>0</id> 
     <value>data</value> 
    </node> 
    <node> 
     <id>1</id> 
     <value>data</value> 
    </node> 
    <node> 
     <id>2</id> 
     <value>data</value> 
    </node> 
</<root> 

各ノードは互いに重複し、おそらくそれらの間にギャップが存在しないことを保証し、その「ID」を有します。 私の質問は、ノードのIDを使用して特定のノードを検索するためにブーストを使用することによって、最も効率的な方法は何ですか?

ありがとうございました。

UPDATE これは、私はアイテムが効率的である見つけるために、ファイル全体をスキャンするとは思わない私は

property_tree::wptree ptree; // has been loaded somewhere 

auto nodes = ptree.get_child(L"root"); 

bool bFound = false; 

for (auto& itr : nodes) 
{ 
    auto & rec = itr.second; 
    int id = rec.get<int>(L"id", -1); 
    if (id == nodeId) 
    { 
     bFound = true; 
     // found it 
     // get other values 
     break; 
    } 
} 

を行った方法です。

+0

あなたがこれまでに(C++コード)しようとしているものを投稿して説明してくださいなぜそれが「効率的」でないのか。 –

+0

@ジムガリソンもちろん、ここで質問を投稿する前に私はそれをしました。誰かが自分の質問に自明なことを見せなかっただけなので、投票する必要はありません。 –

+0

XMLのサイズによっては、選択肢がない場合があります。例えば。私たちの場所では、マルチギガバイトのXMLに遭遇し、それらをすべてメモリに保持する余裕はありません。 – sehe

答えて

1

私はTextReaderインターフェイスでLibXml2を使用しました。

あなたはxmlReaderReadを行うと、ノードが一致したときに表示する(パターンが一致するかどうかをxmlPatterncompilexmlPatternMatchをチェックし続けることができます。

あなたは最高の持っているので、あなたも、その時点で完全な「DOMサブツリー」を得ることができます両方の世界の

CAVEAT:。のlibxml ++のxmlReaderExpand()のラッパーと同様のaccessors¹は、メモリリークが発生する文書化されている私たちの地元のコードベースでこれを修正しました、私は十分に与えられたgithubの上のもののlibrarifiedバージョンを公開することがあります。。インターestと許可。

すべてのすべてで、これは、.NETのXpathReaderとインターフェイスの同じ種類をネット:What ever happened to XPathReader


¹のでTextReader::expand()

+0

お薦めいただきありがとうございます。しかし、何らかの理由で、私は後押ししなければならない。 –

+0

Boostに真のXMLパーサーがないことに気付くだけです。これはProperty Treeライブラリを持ち、あなたが記述したユースケースに対してどのような方法でも最適化されていません – sehe

関連する問題