2015-01-16 2 views
0

내 문제는 C++에서 구문 분석해야하는 큰 xml 파일이 있습니다. 파일은 b.xml이며 각 태그에서 메시지 하위 태그를 가져와야합니다. https://stackoverflow.com/questions/27977851/parsing-xml-file-with-boost-c/27978152#27978152C + +로 구문 분석 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 

당신을 감사

감사

+4

아마 부스트 속성 - 나무처럼, 헤더에만 사용할 수 있습니다 xmlstarlet 또는 xmllint --xpath

¹ 같은 외부 도구를 사용하여 몇 가지 코드를 작성하여 시작하십시오 - 우리는 여기 당신을 위해 이것을하지 않습니다 –

+0

@EdHeal 제가 down-vote 대신에 부여한 링크를 확인하십시오 , 나는 첫 부분을 얻고 그것을 해결하기 위해 도움을 얻으려고 노력했다. 이제 나는 두 번째 부분에 물었다. 나는 이것을 새로운 질문으로 게시하는 대답을 얻었다. 그래서 나는 이것을 별도의 질문으로 게시하고있다. – avinashse

+1

질문 내용이 질문에 있어야합니다. – sehe

답변

1

나는 당신이 구문 분석하는 XML 파서를 사용하는 것이 좋습니다 . 속성 트리에서 이러한 종류의 쿼리를 수행하는 것은 내 경험에 비하면 어렵습니다.

  • What is the best open XML parser for C++?
  • 당신이 XPath를 사용하는 경우

  • What XML parser should I use in C++?
    • , 당신은 단순히 당신이 한 줄로 여기에 원하는 것을 할 수 있습니다. 예 : 사용 PugiXML¹ :

      #include <pugixml.hpp> 
      #include <iostream> 
      
      int main() { 
          pugi::xml_document doc; 
          doc.load_file("input.xml"); 
      
          for (auto& n : doc.select_nodes("//root/MultiMessage/Message/structure/message/@value")) 
           std::cout << n.attribute().value() << "\n"; 
      } 
      

      인쇄 또는

      092374nmkla90u345n09832ljkn0a9845jhklasdf09u8426ljakljdgf09845u6kljsdgp89u45ljsdfp9gu4569078ljk 
      092374nmkla90u345n09832ljkn0a9845jhklasdf09u8426ljakljdgf09845u6kljsdgp89u45ljsdfp9gu4569078ljk 
      092374nmkla90u345n09832ljkn0a9845jhklasdf09u8426ljakljdgf09845u6kljsdgp89u45ljsdfp9gu4569078ljk 
      

    +0

    답장을 보내 주셔서 감사합니다. Linux 용 PugiXML Library를 다운로드하고 압축을 풉니 다. 나는 이클립스를 사용하고 있으며, pugixml 경로에 라이브러리 경로를 추가하고있다. 그러나 이클립스는 경로 검색을 할 수 없다. Google에서 검색 할 때, 나는 비주얼 스튜디오 전용 라이브러리 설정을 얻고있다. 문안 인사. – avinashse

    +0

    make 파일을 사용합니다. 데비안에서'apt-get install libpugixml-dev'을 실행하고'g ++ -std = C++ 11 test.cpp -lpugixml' 명령을 실행합니다. 물론 수동으로 다운로드하거나 설치할 수도 있습니다.이 경우에는 보통 ./configure && make install 또는 (프로젝트에 파일을 포함시키고 ** PUGIXML_HEADER_ONLY ** ** 정의 (http : // pugixml. googlecode.com/svn/tags/latest/docs/manual/install.html#manual.install.building.header)이 작업을 수행해야합니다. – sehe