2012-11-22 34 views
1

我正在尝试使用pugixml从大型XML文件中提取数据。我只是感兴趣的值的节点BAR和值Nm:如何使用pugixml提取子数据?

<Document xmlns="xxxxxx" xmlns:xsi="vvvvvvv"> 
     <Outer> 
     <HDR> 
      <MsgId>FOOBAR222222</MsgId> 
      <ID> 
      <AAAAA>FOOBAR222222</AAAAA> 
      </ID> 
     </HDR> 
     <ENTRY> 
      <Status>existing</Status> 
      <ELEM> 
      <TM>2012-11-19T13:00:00</TM> 
      </ELEM> 
      <FOO> 
      <BAR>xxxxx</BAR> 
      <NM> 
       <Nm>yyyyyyy</Nm> 
      </NM> 
      </FOO> 
     </ENTRY> 

从我所看到的,有可能走的根文件,但是,我得到的访问家长和孩子有点失落节点:

 void walk(xml_node parent) 
     { 
      for(xml_node child = parent.first_child(); child; child = child.next_sibling()) 
      { 
       // ... Would like to output: "FOO: xxxx/NM: yyyyyyyy" 
      } 
     } 
+0

另一个有用的链接是:http://pugixml.googlecode.com/svn/tags /latest/docs/samples/traverse_iter.cpp – poseid

回答

2

你可以给参数到first_child()和其他成员函数:

auto Outer = document.first_child("OUTER"); 
auto Entry = Outer.first_child("ENTRY"); 
auto Foo = Entry.first_child("FOO"); 

当您终于到达目的地时,使用.value()来获取节点值。

PugiXML还具有XPath支持,但在那种情况下可能会过度杀伤。

+0

谢谢!如果ENTRY重复多次,那么first_child选择工作呢?我需要遍历所有ENTRY ...在我的问题中不清楚,对不起! – poseid

+0

然后用'Foo = Foo.next_sibling(“FOO”)'来到下一个Foo节点:) –

+0

太好了!现在,我明白了...只是一个额外的问题,试图为first_child提供一个参数给出:没有匹配的函数调用'pugi :: xml_node :: first_child(const char [9])' – poseid

0

Pugi也有一个简单的路径设施5.10. Miscellaneous functions

你可以做上面只有一行:

document.first_element_by_path("/Document/Outer/ENTRY/FOO/BAR").first_child().value();