문제

잠재적으로 거대한 XML 파일을 구문 분석해야 하므로 DOM 구문 분석기가 배제되는 것 같습니다.

TinyXML과 비교할 수 있는 C++용 경량 SAX 파서가 있습니까?XML의 구조는 매우 간단하며 네임스페이스나 DTD와 같은 고급 기능이 필요하지 않습니다.요소, 속성, cdata만 있으면 됩니다.

Xerces에 대해 알고 있지만 50MB가 넘는 엄청난 크기 때문에 몸이 떨립니다.

감사해요!

도움이 되었습니까?

해결책

C를 사용하는 경우 사용할 수 있습니다. libxml ~로부터 금언 프로젝트. DOM 및 SAX 인터페이스 중에서 문서에 대한 선택과 수년에 걸쳐 개발 된 많은 추가 기능을 선택할 수 있습니다. C ++를 정말로 원한다면 사용할 수 있습니다. libxml ++, 이것은 libxml 주변의 C ++ OO 래퍼입니다.

도서관은 계속해서 입증되었으며, 고성능이며, 찾을 수있는 거의 모든 플랫폼에서 편집 할 수 있습니다.

다른 팁

나는 국외 거주자를 좋아한다
http://expat.sourceforge.net/

C 기반이지만 도움이되는 C ++ 포장지가 여러 개 있습니다.

rapidxml C ++로 작성된 XML의 빠른 파서입니다.

http://sourceforge.net/projects/wsdlpull 이것은 Java xmlpull API의 직접 C++ 포트입니다(http://www.xmlpull.org/)

나는 이 파서를 적극 추천하고 싶다.내 임베디드 장치(STL 지원 없음)에서 사용하기 위해 이를 사용자 정의해야 했지만 오버헤드가 거의 없이 매우 빠르다는 것을 알았습니다.나는 내 자신의 문자열과 벡터 클래스를 만들어야 했고, 그것들을 사용해도 Windows에서는 약 60k로 컴파일됩니다.

풀 파싱은 SAX 같은 것보다 훨씬 직관적이라고 생각합니다.코드는 XML 문서를 훨씬 더 밀접하게 반영하므로 두 문서의 상관 관계를 쉽게 파악할 수 있습니다.

한 가지 단점은 앞으로만 가능하다는 것입니다. 즉, 요소가 올 때마다 구문 분석해야 한다는 의미입니다.우리는 구성 파일을 읽기 위한 디자인이 상당히 엉망이어서 전체 하위 트리를 구문 분석하고 몇 가지 검사를 한 다음 몇 가지 기본값을 설정하고 다시 구문 분석해야 합니다.이 파서를 사용하여 이와 같은 것을 처리하는 유일한 실제 방법은 상태의 복사본을 만들고 이를 구문 분석한 다음 원본을 계속 사용하는 것입니다.이전 DOM 파서에 비해 리소스 측면에서 여전히 큰 승리를 거두었습니다.

XML 구조가 매우 간단한 경우 LEX/YACC (Flex/Bison)를 기반으로 간단한 Lexer/Scanner를 구축하는 것을 고려할 수 있습니다. W3C의 출처는 다음과 같이 영감을 줄 수 있습니다. http://www.w3.org/xml/9707/parser.y 그리고 http://www.w3.org/xml/9707/scanner.l.

참조 libxml의 SAX2 인터페이스

FirstObject 's CMARKUP 가벼운 거대한 파일 풀 파서 (SAX 대신 풀 파서를 추천) 및 거대한 XML 파일 작성자로 작동하는 C ++ 클래스입니다. 실행 파일에 최대 약 250KB를 추가합니다. 메모리 인 메모리를 사용하면 한 사용자의 보고서에 의해 TinyXML의 발자국이 1/3입니다. 거대한 파일에 사용하면 메모리에 작은 버퍼 (16kb) 만 보유합니다. Cmarkup은 현재 상용 제품이므로 단일 CPP 및 H 파일로 프로젝트에 쉽게 추가 할 수 있도록 지원, 문서화 및 설계되었습니다.

시도하는 가장 쉬운 방법은 다음과 같은 무료 FirstObject XML 편집기의 스크립트를 사용하는 것입니다.

ParseHugeXmlFile()
{
  CMarkup xml;
  xml.Open( "HugeFile.xml", MDF_READFILE );
  while ( xml.FindElem("//record") )
  {
    // process record...
    str sRecordId = xml.GetAttrib( "id" );
    xml.IntoElem();
    xml.FindElem( "description" );
    str sDescription = xml.GetData();
  }
  xml.Close();
}

파일 메뉴에서 새 프로그램을 선택하고이를 붙여 넣고 요소 및 속성에 대해 수정하고 F9를 눌러 F10을 눌러 라인별로 단계별로 진행하십시오.

당신은 시도 할 수 있습니다 https://github.com/thinlizzy/die-xml . 매우 작고 사용하기 쉬운 것 같습니다.

이것은 최근에 만들어진 C ++ 0x XML Sax Sax Parser 오픈 소스이며 저자는 기꺼이 피드백입니다.

입력 스트림을 구문 분석하고 std :: function과 호환되는 콜백에서 이벤트를 생성합니다.

스택 머신은 유한 Automata를 백엔드로 사용하고 일부 이벤트 (시작 태그 및 텍스트 노드)를 사용하여 반복자를 사용하여 버퍼링을 최소화하여 매우 가볍습니다.

나는 그 도구를 볼 것이다 DTD/스키마 별 파서를 생성하십시오 작고 빠르게 원한다면. 이것들은 거대한 문서에 매우 좋습니다.

적극 권장합니다 pugixml

PugixML은 가벼운 C ++ XML 프로세싱 라이브러리입니다.

"PugixML은 C ++ XML 프로세싱 라이브러리로, Rich Traversal/Modification 기능, XML 파일/버퍼에서 DOM 트리를 구성하는 매우 빠른 XML 파서 및 복잡한 데이터에 대한 XPath 1.0 구현으로 구성된 C ++ XML 프로세싱 라이브러리입니다. 구동 트리 쿼리. 유니 코드 인터페이스 변형과 다른 유니 코드 인코딩 간의 변환과 함께 전체 유니 코드 지원도 사용할 수 있습니다. "

상용 제품에서 PugixML을 선택하고 사용하기 전에 몇 개의 비싼 파서를 포함하여 몇 개의 XML 파서를 테스트했습니다.

Pugixml은 가장 빠른 파서 일뿐 만 아니라 가장 성숙하고 친근한 API를 가졌습니다. 나는 그것을 강력히 추천합니다. 매우 안정적인 제품입니다! 버전 0.8 이후로 사용하기 시작했습니다. 이제 1.7입니다.

이 파서의 큰 보너스는 XPath 1.0 구현입니다! 더 복잡한 트리 쿼리의 경우 XPath는 신의 전송 기능입니다!

Rich Traversal/Modification 기능을 갖춘 DOM- 유사 인터페이스는 실제 "무거운"XML 파일을 다루는 데 매우 유용합니다.

작고 빠른 파서입니다. C ++ 코드를 연결하는 것이 마음에 들지 않으면 iOS 또는 Android 앱에서도 좋은 선택입니다.

벤치 마크는 많이 말할 수 있습니다. 보다: http://pugixml.org/benchmark.html

(x86)에 대한 몇 가지 예 :

pugixml is more than 38 times faster than TinyXML

                    4.1 times faster than CMarkup,

                    2.7 times faster than expat or libxml

(x64)의 경우 pugixml은 내가 아는 가장 빠른 파서입니다.

XML 파서의 메모리 사용도 확인하십시오. 일부 파서는 단지 귀중한 추억을 간다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top