programing

Boost를 사용하여 XML 파일 읽기 및 쓰기

itmemos 2023. 9. 24. 12:21
반응형

Boost를 사용하여 XML 파일 읽기 및 쓰기

Boost를 사용하여 XML 파일을 읽고 쓰는 좋은 방법(그리고 간단한 방법)이 있습니까?

Boost를 사용하여 XML 파일을 읽을 수 있는 간단한 샘플을 찾을 수 없는 것 같습니다.XML 파일을 읽고 쓰는 데 Boost를 사용하는 간단한 샘플을 알려주실 수 있나요?

Boost가 아니라면 추천할 만한 XML 파일을 읽고 쓸 수 있는 좋은 간단한 라이브러리가 있습니까?(C++ 라이브러리여야 함)

Pugixml C++용 가볍고 간단하고 빠른 XML 파서를 사용해 보십시오.

pugixml의 가장 좋은 점은 TinyXML과 RapidXML이 부족한 XPath 지원입니다.

인용 RapidXML의 저자 "이 프로젝트에 영감을 준 pugixml에 대한 Arseny Kapoulkine의 연구에 감사드립니다." 및 "내가 아는 가장 빠른 XML 파서인 pugixml보다 5% - 30% 빠릅니다." 그는 최근 버전 0.42에 도달한 pugixml의 버전 0.3에 대해 테스트했습니다.

다음은 pugixml 설명서에서 발췌한 내용입니다.

주요 기능은 다음과 같습니다.

  • 낮은 메모리 소비 및 조각화(pugxml에 대한 승리는 ~1.3배, TinyXML - ~2.5배, Xerces (DOM) - ~4.3배 1).정확한 수치는 기존 파서와의 비교 섹션에서 확인할 수 있습니다.
  • 매우 빠른 구문 분석 속도(pugxml을 통한 win over pugxml은 ~6배, TinyXML은 ~10배, Xerces-DOM은 ~17.6배 1)
  • 매우 빠른 구문 분석 속도(음, 반복하고 있지만 속도가 너무 빨라 테스트 XML에서 Expat보다 2.8배 빠름) 2
  • 다소 표준 적합(DTD 관련 문제를 제외하고 표준 호환 파일을 올바르게 구문 분석함)
  • 거의 오류를 무시합니다. (expat will과 같이 You & Me와 같은 것에 질식하지 않습니다. 잘못된 인코딩의 데이터가 있는 파일을 파싱합니다. 등)
  • clean interface (중복사된 pugxml의 것)
  • 다소 유니코드 인식 (실제로는 입력 데이터의 UTF-8 인코딩을 가정하지만, 현재로서는 ANSI에서 쉽게 작동하지만 UTF-16은 사용하지 않습니다(Future work 참조), 도우미 변환 기능(UTF-8 <-> UTF-16/32(std::wstring & wchar_t의 기본값은 무엇이든)
  • 완전한 표준 호환 C++ 코드(Comaistrict 모드에 의해 승인됨), 라이브러리는 멀티플랫폼(플랫폼 목록 참조)
  • 고도의 유연성파싱 옵션을 통해 파일 파싱 및 DOM 트리 빌딩의 여러 측면을 제어할 수 있습니다.

좋아요, 뭐가 문제냐고 물어볼 수도 있어요.XML 구문 분석을 위한 작고 빠르고 강력하며 깨끗한 솔루션입니다. 무엇이 부족합니까?네, 저희는 공정한 개발자입니다. 여기 잘못된 기능 목록이 있습니다.

  • 메모리 소모내가 아는 모든 DOM 기반 파서를 능가하지만 SAX 파서가 오면 기회가 없습니다.4Gb 미만의 메모리로는 2Gb XML 파일을 처리할 수 없고, 빠르게 처리할 수도 있습니다.pugixml이 다른 모든 DOM 기반 파서보다 잘 동작하지만, DOM에 갇혀 있다면 문제가 되지 않습니다.
  • 메모리 소모좋아요, 반복하고 있습니다.다시.다른 파서에서 일정한 저장소(또는 메모리 매핑된 영역)에 XML 파일을 제공할 수 있는 경우 pugixml은 제공하지 않습니다.따라서 전체 데이터를 일정하지 않은 스토리지에 복사해야 합니다.또한 파서의 수명 동안에도 지속되어야 합니다(그 이유 및 수명에 대한 자세한 내용은 아래에 기술되어 있습니다).다시 말하지만, DOM에 문제가 없다면 문제가 되지 않을 것입니다. 왜냐하면 전체 메모리 사용량이 적기 때문입니다(물론, 문제가 될 수 있는 연속된 메모리 덩어리가 필요하겠지만).
  • 유효성 검사 부족, DTD 처리, XML 네임스페이스, 적절한 인코딩 처리.필요하시면 MSXML이나 XercesC 같은 것을 가져가세요.

TinyXML은 아마도 좋은 선택일 것입니다.부스트(Boost)의 경우:

속성_이 있습니다.Boost Repository트리 라이브러리.접수는 되었지만, 현재 지원이 부족한 것 같습니다(EDIT: Property_Tree는 버전 1.41 이후 Boost의 일부가 되었습니다. XML 기능에 관한 설명서를 읽으십시오.

Daniel Nuffer는 Boost Spirit을 위해 xml 파서를 구현했습니다.

Boost속성 트리채우는 방법 페이지의 XML 파서 에 설명된 대로 RapidXML을 사용합니다.

유감스럽게도 글을 쓰는 현재 Boost에는 XML 파서가 없습니다.따라서 라이브러리에는 XML 구문 분석 지원을 제공하기 위한 빠르고 작은 RapidXML 구문 분석기(현재 버전 1.13)가 포함되어 있습니다.RapidXML은 XML 표준을 완전히 지원하지 않으므로 DTD를 구문 분석할 수 없으므로 전체 개체를 대체할 수 없습니다.

XML 부스트 튜토리얼도 참고하시기 바랍니다.

OP가 "xml 파일을 읽고 쓰는부스트를 사용하는 간단한 방법"을 원하기 때문에, 저는 아래의 매우 기본적인 예를 제공합니다.

<main>
    <owner>Matt</owner>
    <cats>
        <cat>Scarface Max</cat>
        <cat>Moose</cat>
        <cat>Snowball</cat>
        <cat>Powerball</cat>
        <cat>Miss Pudge</cat>
        <cat>Needlenose</cat>
        <cat>Sweety Pie</cat>
        <cat>Peacey</cat>
        <cat>Funnyface</cat>
    </cats>
</main>

(고양이 이름은 Matt Mahoney의 홈페이지에서 가져온 것입니다.)

C++에 해당하는 구조:

struct Catowner
{
    std::string           owner;
    std::set<std::string> cats;
};

read_xml() 용도:

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

Catowner load(const std::string &file)
{
    boost::property_tree::ptree pt;
    read_xml(file, pt);

    Catowner co;

    co.owner = pt.get<std::string>("main.owner");

    BOOST_FOREACH(
       boost::property_tree::ptree::value_type &v,
       pt.get_child("main.cats"))
       co.cats.insert(v.second.data());

    return co;
}

write_xml() 용도:

void save(const Catowner &co, const std::string &file)
{
   boost::property_tree::ptree pt;

   pt.put("main.owner", co.owner);

   BOOST_FOREACH(
      const std::string &name, co.cats)
      pt.add("main.cats.cat", name);

   write_xml(file, pt);
}

작고 좋은 C++ 라이브러리인 TinyXML도 있습니다.하위 수준의 라이브러리를 찾고 있다면 RapidXML이 가장 좋은 시작점입니다.

Boost serialization이 XML의 아카이브를 읽고 쓸 수 있는 것처럼 보입니다.

Boost를 통해 XML을 보다 쉽게 사용

XML 구문 분석을 위한 boost에 특정 라이브러리는 없지만 여러 가지 대안이 있습니다. libxml, Xerces, Expat.

물론 다른 도서관들 중 일부를 사용하여 자신의 도서관을 만드는 데 도움을 줄 수 있지만, 그것은 아마도 상당한 노력이 될 것입니다.

그리고 여기 IBM의 주제에 대한 전체 기사가 있습니다.

Boost는 XML 파서 atm을 제공하지 않습니다.

Poco XML(Poco C++ libs의 일부)은 좋고 간단합니다.

확실히 TinyXML 사용 *엄지척*

DOM 기능만 찾는 경우 이 스레드에 이미 제안된 사항이 있습니다.저는 개인적으로 XPath 지원이 부족한 라이브러리를 신경쓰지 않을 것이고, C++에서는 Qt를 사용할 것입니다.TinyXPath도 있고, 아라비카는 XPath 지원을 받는다고 주장하지만, 저는 그것들에 대해 아무 말도 할 수 없습니다.

Boost mailing list에 숨어있던 제 경험으로 볼 때, XML이 주제로 떠오를 때마다 유니코드에 대한 토론으로 전환되는 것으로 보입니다.하지만 현재 유니코드 라이브러리가 등장할 가능성이 있기 때문에 XML 라이브러리가 등장하는 데는 그리 오랜 시간이 걸리지 않을 것으로 생각합니다.

그동안 저도 TinyXML을 사용해 왔습니다.

RapidXML에 대한 흥미로운 링크입니다. 한번 보겠습니다.

아라비카 보기

경고.RapidXML을 좋아하지만 UTF16을 구문 분석할 때 매우 고약한 버그가 있습니다. 일부 유효한 값으로 인해 충돌이 발생합니다.

pugixml을 추천하고 싶지만 네임스페이스 지원이 부족하여 문제가 될 것으로 알고 있습니다.

Boost의 기존 제안을 개선하기 위한 GSoC 제안 작업이 있습니다.XML : https://github.com/stefanseefeld/boost.xml 하지만 Andzej가 Boost를 제안했습니다.속성 트리는 이 작업에 적합합니다.xml 크기와 필요한 검증 지원에 따라 달라질 수 있습니다.

최근에 Boost Mailing List에 제안된 라이브러리도 있습니다: http://www.codesynthesis.com/projects/libstudxml/doc/intro.xhtml

<?xml version="1.0"?>
<Settings>
  <GroupA>
      <One>4</One>
      <Two>7</Two>
      <Three>9</Three> 
  </GroupA>
  <GroupA>
      <One>454</One>
      <Two>47</Two>
      <Three>29</Three> 
  </GroupA>
  <GroupB>
      <A>String A</A>
      <B>String B</B>  
  </GroupB>  
</Settings>

BOOST로 XML을 쉽게 읽을 수 있는 방법이 있습니다.이 예제는 std::wstring:

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

bool CMyClass::ReadXML(std::wstring &full_path)
{
    using boost::property_tree::wptree;

    // Populate tree structure pt:
    wptree pt;
    std::wstringstream ss; ss << load_text_file(full_path); // See below for ref.
    read_xml(ss, pt);

    // Traverse pt:
    BOOST_FOREACH(wptree::value_type const& v, pt.get_child(L"Settings"))
    {
        if (v.first == L"GroupA")
        {
            unsigned int n1 = v.second.get<unsigned int>(L"One");
            unsigned int n2 = v.second.get<unsigned int>(L"Two");
            unsigned int n3= v.second.get<unsigned int>(L"Three");
        }
        else if (v.first == L"GroupB")
        {
            std::wstring wstrA = v.second.get<std::wstring>(L"A");
            std::wstring wstrB = v.second.get<std::wstring>(L"B");
        }
    };
}

속성을 읽는 것은 조금 더 복잡할 뿐입니다.

-

참고용:

std::wstring load_text_file(std::wstring &full_path)
{
    std::wifstream wif(full_path);

    wif.seekg(0, std::ios::end);
    buffer.resize(wif.tellg());
    wif.seekg(0);
    wif.read(buffer.data(), buffer.size());

    return buffer;
}

부스트 스피릿은?

여기 '미니 XML' 파서가 나와 있습니다

언급URL : https://stackoverflow.com/questions/1042855/using-boost-to-read-and-write-xml-files

반응형