2015-01-16 1 views
0

Мне нужно разобрать один XML-файл с помощью boost C++, я написал один тестовый код, который работает для этого xml. a.xmlАнализ XML-файла с Boost C++

<a> 
    <modules> 
     <module>abc</module> 
     <module>def</module> 
     <module>ghi</module> 
    </modules> 
</a> 

Выход приходит

abc 
def 
ghi 

но для этого a.xml файла, мой тестовый код не показывает никаких выходных, 3 пустые строки поступают в качестве выходных данных.

<a> 
    <modules> 
     <module value = "abc"/> 
     <module value = "def"/> 
     <module value = "abc"/> 
    </modules> 
</a> 

здесь тестовый код:

#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/xml_parser.hpp> 
#include <boost/foreach.hpp> 
#include <iostream> 

int main() 
{ 
    using boost::property_tree::ptree; 
    ptree pt; 
    read_xml("a.xml",pt); 
    BOOST_FOREACH(ptree::value_type &v, pt.get_child("a.modules")) 
     std::cout<<v.second.data()<<std::endl; 
    return 0; 
} 

Моя проблема, я имею большой файл XML, который содержит смесь узоров из обоих файлов, и я должен разобрать его. Файл b.xml, и я должен получать сообщения из каждого тега.

<MultiMessage> 
    <Message structID="1710" msgID="0" length="50"> 
     <structure type="AppHeader"> 
     </structure> 
    </Message> 
    <Message structID="27057" msgID="27266" length="315"> 
     <structure type="Container"> 
      <productID value="166"/> 
      <publishTo value="xyz"/> 
      <templateID value="97845"/> 
      <sendingTime value="1421320622367060444"/> 
      <message value="092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK"/> 
     </structure> 
    </Message> 
</MultiMessage> 
<MultiMessage> 
    <Message structID="1710" msgID="0" length="50"> 
     <structure type="AppHeader"> 
     </structure> 
    </Message> 
    <Message structID="27057" msgID="27266" length="315"> 
     <structure type="Container"> 
      <productID value="166"/> 
      <publishTo value="xyz"/> 
      <templateID value="97845"/> 
      <sendingTime value="1421320622367060444"/> 
      <message value="092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK"/> 
     </structure> 
    </Message> 
</MultiMessage> 
<MultiMessage> 
    <Message structID="1710" msgID="0" length="50"> 
     <structure type="AppHeader"> 
     </structure> 
    </Message> 
    <Message structID="27057" msgID="27266" length="315"> 
     <structure type="Container"> 
      <productID value="166"/> 
      <publishTo value="xyz"/> 
      <templateID value="97845"/> 
      <sendingTime value="1421320622367060444"/> 
      <message value="092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK"/> 
     </structure> 
    </Message> 
</MultiMessage> 

и вывод должен быть:

092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK 
092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK 
092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK 

Спасибо

С уважением

ответ

1

Boost Documentation:

Атрибуты элемента XML хранятся в подразделе. В узле атрибута есть один дочерний узел для каждого атрибута. Существование узла не гарантируется или необходимо, если нет атрибутов.

<module value = "abc"/> 
//One way would be this: 
boost::get<std::string>("module.<xmlattr>.value"); 

Еще один способ (непроверенные), который, как представляется, лучше:

BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("a.modules")) 
{ 
    std::cout << v.second.get_child("<xmlattr>.type").data() << std::endl; 
    std::cout << v.second.get_child("<xmlattr>.Reference").data() << std::endl; 
} 

еще один взят из here.

//Parse XML... 
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("a.modules")) 
{ 
    const boost::property_tree::ptree &attributes = v.second.get_child("<xmlattr>", boost::property_tree::ptree()); 
    BOOST_FOREACH(const boost::property_tree::ptree::value_type &v, attributes) 
    { 
     std::cout << v.first.data() << std::endl; 
     std::cout << v.second.data() << std::endl; 
    } 
} 
+0

Понял, спасибо :) – avinashse

+0

Это но у меня другой файл, я редактировал свой вопрос, и мне нужно разобрать поле сообщения, как это сделать. – avinashse

+1

@avinashse новые вопросы должны ставиться как новый вопрос. – sehe