Groovy XmlSlurper 대 XmlParser


79

이 주제에 대해 잠시 검색 한 결과 몇 가지 결과도 찾았습니다. 이는 게시물 끝에서 언급하고 있습니다. 누군가 아래에 나열된 사례에 대해이 세 가지 질문에 정확하게 대답하도록 도와 줄 수 있습니까?

  1. XmlSluper를 사용하는 사용 사례가 XmlParser보다 더 합리적이며 그 반대의 경우 (API / 구문의 사용 용이성 관점에서 볼 때)?

  2. 어느 것이 더 메모리 효율적입니까? (Slurper처럼 보입니다)

  3. 어느 것이 xml을 더 빨리 처리합니까?

사례 a. XML에서 거의 모든 노드를 읽어야 할 때?

사례 b. 몇 개의 노드 만 읽어야 할 때 (예 : gpath 표현식 사용)?

사례 c. xml을 업데이트 / 변환해야 할 때?

xml 문서가 사소한 문서가 아닌 경우 (xml의 깊이 및 크기 수준).

자원 :

http://www.tutkiun.com/2009/10/xmlparser-and-xmlslurper.html 은 다음과 같이 말합니다.

XMLParser와 XMLSlurper의 차이점 :

간단한 읽기에 사용되는 경우 XMLParser와 XMLSlurper 사이에 유사점이 있지만 고급 읽기에 사용할 때와 다른 형식의 XML 문서를 처리 할 때는 둘 사이에 차이가 있습니다.

XMLParser는 문서를 구문 분석 한 후 중간 결과를 저장합니다. 하지만 한편으로는,

XMLSlurper는 XML 문서를 처리 한 후 내부 결과를 저장하지 않습니다.

파싱 ​​된 정보를 처리 할 때 실제적이고 근본적인 차이점이 분명해집니다. 즉, 스트리밍 시나리오에서 직접 내부 데이터 조작 및 처리로 처리 할 때입니다.

http://groovy.dzone.com/news/john-wilson-groovy-and-xml

그루비 문서 ( XmlParser , XmlSlurper )와 그루비 사이트는 그것들을 잘 설명 하지만 ( 여기여기 ) 앞서 언급 한 질문을 잘 설명하지는 못합니다.

답변:


106

XmlSlurper와 XmlParser의 가장 큰 차이점은 Parser는 DOM과 유사한 것을 생성하는 반면 Slurper는 실제로 필요한 경우에만 구조를 생성하여 느리게 평가되는 경로를 사용한다는 것입니다. 사용자에게는 둘 다 매우 동등하게 보일 수 있습니다. 차이점은 파서 구조가 한 번만 평가된다는 것입니다. 슬러 퍼 경로는 요청시 평가 될 수 있습니다. On demand는 여기서 "더 많은 메모리 효율적이지만 느리다"라고 읽을 수 있습니다. 궁극적으로 얼마나 많은 경로 / 요청을 수행하는지에 따라 다릅니다. 예를 들어 XML의 특정 부분에있는 속성의 값만 알고이를 수행하려는 경우 XmlParser는 여전히 모든 것을 처리하고 준 DOM에서 쿼리를 실행합니다. 많은 객체가 생성되고 메모리와 CPU가 소비됩니다. XmlSlurper는 개체를 생성하지 않으므로 메모리와 CPU를 절약합니다.

둘 다 문서에서 변환을 수행 할 수 있지만 slurper는 상수라고 가정하므로 먼저 변경 사항을 작성하고 새 xml을 읽기 위해 새 slurper를 만들어야합니다. 파서는 변경 사항을 즉시 볼 수 있도록 지원합니다.

따라서 질문 (1), 유스 케이스에 대한 대답은 전체 XML을 처리해야하는 경우 파서를 사용하고, 일부만 처리해야하는 경우에는 부끄러운 것입니다. API와 구문은 실제로 그다지 중요한 역할을하지 않습니다. Groovy 사람들은 사용자 경험에서이 두 가지를 매우 유사하게 만들려고합니다. 또한 XML을 점진적으로 변경하려는 경우 슬러 퍼보다 파서를 선호합니다.

위의 소개는 또한 메모리 효율성이 더 높은 질문 (2)을 설명합니다. 당신이 어쨌든 모든 것을 읽지 않는 한, 파서가 할 수 있지만, 그 차이가 얼마나 큰지에 대한 실제 수치는 없습니다.

또한 질문 (3)은 인트로에서 답할 수 있습니다. 지연 평가 된 경로가 여러 개있는 경우 다시 평가해야합니다. 파서에서와 같이 기존 그래프를 탐색하는 것보다 속도가 느릴 수 있습니다. 따라서 파서는 사용량에 따라 더 빠를 수 있습니다.

따라서 (3a) 거의 모든 노드를 읽는 것은 그다지 큰 차이가 없습니다. 요청이 더 결정적인 요소이기 때문입니다. 그러나 (3b)의 경우에는 메모리에 완전한 구조를 만들 필요가 없기 때문에 몇 개의 노드 만 읽어야한다면 슬러 퍼가 더 빠르다고 말할 수 있습니다. 그 자체로는 이미 시간과 메모리가 소모됩니다.

(3c)에 관해서는 ... 요즘은 둘 다 XML을 업데이트 / 변환 할 수 있습니다. 이것은 실제로 변경해야하는 xml 부분의 수와 더 관련이 있습니다. 많은 부분이 있으면 파서라고 말하고 그렇지 않다면 아마도 슬러 퍼라고 말할 것입니다. 그러나 예를 들어 slurper를 사용하여 속성 값을 "Fred"에서 "John"으로 변경하려는 경우 나중에 동일한 slurper를 사용하여이 "John"을 쿼리하기 위해 작동하지 않습니다.


slurper와 관련하여 업데이트에 대한 멋진 설명, 감사합니다. 이것은 당연히 작동하지 않을 슬러 퍼에서 "비어있을 때"노드를 재귀 적으로 삭제하려고 할 때 내 문제를 해결했습니다.
산도스

4

나는 당신에게 선명한 대답을 줄 것입니다 :

* XML 파서는 XML Slurper보다 빠릅니다.
* XML Slurper는 XML 파서보다 적은 메모리를 사용합니다.
* XML 파서는 XML을 동시에 구문 분석하고 업데이트 할 수 있습니다.
* XML Slurper의 경우 업데이트 할 때마다 XML을 MarkupBuild해야합니다.
* 경로 표현식을 사용하려면 XML Slurper가 파서보다 낫습니다.
* 거의 모든 노드를 읽기위한 XML 파서는 괜찮을 것입니다.

도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.