2011-09-26 4 views
65

이 주제에 대해 잠시 동안 검색 한 결과 일부 게시물도 찾았습니다. 게시물의 끝 부분에서 언급하고 있습니다. 누군가가 아래 나열된 사례에 대해이 세 가지 질문에 정확하게 답변 할 수 있습니까? 사용 사례 사용 XmlSluper이 XmlParser가와 (API/구문의 사용보기 용이성의 관점에서) 그 반대보다 더 많은 의미가있는Groovy XmlSlurper 대 XmlParser

  1. ?

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

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

사례 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)와 그루비의 사이트

잘 ( herehere)을 설명하지만, 상기 질문에 설명에 좋은 일을하지 않습니다.

답변

90

XmlSlurper와 XmlParser의 가장 큰 차이점은 Parser는 DOM과 비슷한 것을 만들지 만 Slurper는 실제로 필요한 경우에만 구조를 만들려고하므로 느슨하게 평가되는 경로를 사용한다는 것입니다. 사용자 모두에게 매우 똑같이 보일 수 있습니다. 차이점은 구문 분석기 구조가 한 번만 평가된다는 것입니다. 요구 사항에 따라 슬래 이퍼 경로가 평가 될 수 있습니다. 온 디맨드는 "더 효율적이지만 더 느린 메모리"로 읽을 수 있습니다. 궁극적으로 그것은 당신이하는 경로/요청의 수에 달려 있습니다.예를 들어 XML의 특정 부분에있는 특성의 값만 알고 필요가있는 경우 XmlParser는 여전히 모든 항목을 처리하고 유사 DOM에 대한 쿼리를 실행합니다. 많은 객체가 생성되어 메모리와 CPU가 소비합니다. XmlSlurper는 개체를 만들지 않으므로 메모리와 CPU를 절약 할 수 있습니다. 어쨌든 문서의 모든 부분이 필요하다면 적어도 파서만큼 많은 객체를 생성 할 것이므로 slurper는 이점을 잃어 버리게됩니다.

둘 다 문서에서 변형을 수행 할 수 있지만 슬래퍼는 상수라고 가정하므로 변경 사항을 먼저 작성하고 새 xurl을 작성하여 새 xurl을 작성해야합니다. 파서는 변경 사항을 올바르게 볼 수 있도록 지원합니다 떨어져.

그래서 전체 XML을 처리해야하는 경우 파서를 사용하는 경우 (1)의 경우, 일부만 사용하는 경우 슬러퍼를 사용하는 것이 좋습니다. API와 문법은 그다지 중요한 역할을하지 않습니다. 그루비 사람들은 두 가지를 사용자 환경에서 매우 유사하게 만듭니다. 또한 XML을 점차적으로 변경하려는 경우 파서를 선호하는 경향이 있습니다.

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

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

그래서 (3a) 거의 모든 노드를 읽는 것이 차이가별로 없다고 말할 것입니다. 요구가 더 중요한 요소이기 때문입니다. 하지만 (3b)의 경우, 노드가 몇 개만 읽히는 경우 슬래퍼가 더 빠르다고 말하고 싶습니다. 메모리에서 전체 구조를 생성 할 필요가 없으므로 시간과 메모리 비용이 이미 들기 때문입니다.

(3c)와 같이 요즘은 둘 다 XML을 업데이트/변형 할 수 있습니다. 더 빠른 XML은 실제로 변경해야하는 XML 부분과 더 관련이 있습니다. 많은 부분을 파서라고 말하면, 그렇지 않다면, 아마 어리석은 사람 일 겁니다. 그러나 예를 들어 속성 ​​값을 "Fred"에서 "John"으로 변경하려는 경우, 나중에이 "John"에 대해 동일한 slurper를 사용하여 쿼리하면 나중에 작동하지 않습니다.

+0

슬퍼하는 사람에 관해서는 업데이트에 대한 굉장한 설명, 감사합니다. 이것은 슬 루퍼에서 "비어있는"경우 노드를 반복적으로 삭제하려고 할 때 내 문제를 해결했지만 당연히 작동하지 않습니다. – sandos