2009-12-08 5 views
2

XMLReader를 사용해야하므로 구문 분석해야하는 매우 큰 XML 파일이 있습니다. 그래서이 개별적으로 각각의로드 드리겠습니다XMLReader를 사용하여 문서의 요소를 나타내는 객체를 만들 수 있습니까?

<topLevelElement> 
    <SecondLevelElement> 
    <Information1>blah</Information1> 
    <Information2>blah</Information2> 
    <Information3>blah</Information3> 
    </SecondLevelElement> 
    <SecondLevelElement> 
    .... 
</topLevelElement> 

각각의 두 번째 레벨 요소가 매우 큰되지 않습니다 :이 파일은 내가 예에서 관심있는 정보를 포함하는 두 번째 레벨 요소의 큰 숫자를 포함 개체 및 구문 분석하려고하는 파일의 스키마를 기반으로 내 독자 코드를 구조화하는 것이 좋습니다.

내 스키마 개체를 만들 xsd.exe를 사용하고이 시도했다 :

while(lReader.Read()) 
{ 
    if (lReader.Name == "SecondLevelElement") 
    { 
    MyXml.SecondLevelElement lSecondLevelElement = lReader.ReadElementContentAs(typeof(MyXml.SecondLevelElement), null) as MyXml.SecondLevelElement; 

    if (lSecondLevelElement != null) 
    { 
     // Do stuff 
    } 
    } 
} 

을하지만 ReadElementContentAs에없는 매우 도움이 예외와 함께 실패합니다(). MSDN의 예제는 아주 기본적인 데이터 유형에이 방법을 사용했기 때문에이 작업을 수행 할 수 있다고 확신하지는 못합니다.

그래서 내 첫 번째 질문은 이것이 가능한가, 아니면 잘못된 시간에 완전히 짖는 시간을 낭비하는 것인가? 내가 틀렸다면 독서 코드를 구조화하지 않고 XML 섹션을 구문 분석하여 XSD와 거의 일치시키는 방법이 있습니까?

EDIT 파벨의 답변을 적용한 후 디시리얼 라이 제이션 오류가 발생했습니다. 내 경우에는 자동으로 클래스를 생성하는 데 사용했던 XSD까지 내려갔습니다. 전체 문서에 대한 XSD가 있으므로 두 번째 수준 요소 클래스 이름이 실제 요소 이름과 일치하지 않습니다. 이 문제를 해결하기 위해 XSD 스키마에서 최상위 요소를 제거하고 클래스를 다시 생성했습니다. 그렇게 한 후에는 모두 완벽하게 작동했습니다.

답변

3

ReadElementContentAsint 같은 대부분의 원시 형의 미리 정의 된, DateTime 등 그것은 xsd.exe에 의해 생성 된 유형과 함께 사용할 수 아니다 작동 - 사람들에 의해 처리됩니다 XmlSerializer :

private static readonly XmlSerializer secondLevelElementSerializer = 
    new XmlSerializer(typeof(MyXml.SecondLevelElement)); 
... 
XmlReader reader; 
while (reader.Read()) 
{ 
    ... 
    switch (reader.Name) 
    { 
     case "SecondLevelElement": 
      { 
       MyXml.SecondLevelElement elem = (MyXml.SecondLevelElement) 
         secondLevelElementSerializer.Deserialize(reader); 
       ... 
      } break; 
     ... 
    } 
} 
+0

매력처럼 작동합니다. – Marcel

관련 문제