2016-05-02 4 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> 

Каждый узел имеет свой «идентификатор», который гарантирует быть не дублируется друг с другом и, возможно, есть промежутки между ними. Мой вопрос - это самый эффективный способ, используя boost для поиска определенного узла с помощью идентификатора узла?

Спасибо.

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

@JimGarrison Конечно, я сделал это, прежде чем задавать вопрос здесь. Вам не нужно голосовать только потому, что кто-то не проявил тривиальности в своем вопросе. –

+0

В зависимости от размера вашего XML у вас может не быть выбора. Например. на нашем месте мы сталкиваемся с многогигабайтными XML-файлами, и вы просто не можете позволить себе держать их в памяти. – sehe

ответ

1

Я использовал LibXml2 с интерфейсом TextReader.

Вы можете продолжать делать xmlReaderRead и проверить, соответствует ли шаблон (xmlPatterncompile и xmlPatternMatch видеть, когда узел соответствует.

Вы даже можете получить полный профиль «DOM поддерево» в этой точке, так что у вас есть лучший из обоих миров

CAVEAT:. LibXML ++ обертка 's из xmlReaderExpand() и подобных accessors¹ документированы для утечки памяти я установил это в нашей локальной базе кода я мог бы опубликовать librarified версию, что на GitHub данного достаточно.. между est и разрешение.

В целом, это Сетки такой же интерфейс, как XpathReader .NET в: What ever happened to XPathReader


¹ так TextReader::expand()

+0

Спасибо за рекомендацию. Но по некоторым причинам я должен настаивать на повышении. –

+0

Конечно. Просто поймите, что Boost не имеет истинного синтаксического анализа XML. Он имеет библиотеку дерева свойств и никоим образом не оптимизирован для используемого вами примера – sehe

Смежные вопросы