2013-11-22 3 views
2

여러 개의 큰 (3meg'ish) 파일 중에서 특정 XML 노드 ('진행률'노드)를 읽어야하는 응용 프로그램에서 작업 중입니다 ..XML 특정 요소를 가능한 한 효율적으로 검색하십시오.

내가 TextReader를하고하여 XDocument를 통해,로가

TextReader reader = null; 
reader = new StreamReader(Filename); 
XDocument objDoc = XDocument.Load(reader); 

var progressElement = objDoc.Root.Element("Progress");   

var lastAccessTime = progressElement.Element("LastTimeAccessed").Value; 
var user = progressElement.Element(("LastUserAccessed").Value; 
var lastOpCode = progressElement.Element("LastOpCodeCompleted").Value; 
var step = progressElement.Element("StepsCompleted").Value; 

하여 XDocument 아래에 표시 것을하고 있어요

, 내가 무엇을하기 전에 전체 파일을 메모리로로드, 생각합니다. 그러나, 나는 내가 아는! 필요 없어 노드는 파일의 첫 번째 노드가 될 것입니다.

'찾기'xml 구문의 유형이 있습니까? 먼저 전체 파일을 캐시하지 않는가?

위에서 언급 한 속성 (여기서 끔찍한 무선)에 대해 10 개의 파일을 구문 분석하는 데 15 초가 걸립니다.

+0

XmlReader는 무엇을할까요? "noone xml"API를 좋아하지만, DOM이 아니라 streamin입니다. –

+0

나는 그 해결책을 피하기 위해 노력하고 있지만 그 시작점은 유일한 선택처럼 보입니다. – greggorob64

답변

0

예. XDocument와 다르게 작동하는 SAX 파서를 사용할 수 있습니다. 기본적으로 SAX 파서는 입력 XML을 통해 작동하여 콜백 코드에서 이벤트를 다시 발생시킵니다. (이러한 콜백 핸들러를 작성합니다.) 주요 이점;

  1. 전체 문서를 메모리 모델로 읽을 필요는 없습니다. (A DOM)
  2. 당신이 원할 때 처리를 멈출 수 있습니다. 당신이 원하는 모든 속도의 경우

http://www.ibm.com/developerworks/library/x-tipsaxstop/

1

XmlReader를 한 번 봐 가지고하는 것은 당신의 최선의 선택입니다. 노드는 처음부터 시작하여 한 번에 하나의 노드를 읽습니다. 큰 한계는 XML 문서에 임의로 액세스하거나 뒤로 이동할 수 없다는 것입니다.

+0

지금 샘플을 타이핑하고 있는데, 네트워크 파일에서 '새로운 StreamReader'를 호출하는 데 1.5 초가 걸립니다. 나는 xdocument 또는 xmlreader를 사용하는지 여부에 관계없이 시간 패널티가 거기에있게 될 것이라고 생각하고 있습니다. xdocument가 병목 현상이 아니라고 생각합니다. – greggorob64

관련 문제