예제 C#3.5에서 큰 XML 파일의 스트리밍 읽기를 수행하는 방법



c# xmlreader 예제 (5)

XML 쿼리에 객체 모델 (예 : XElement \ XDocument)을 사용하려는 경우 불가능하다고 생각합니다. 분명히, 당신은 충분한 데이터를 읽지 않고 XML 객체 트리를 만들 수 없습니다. 그러나 XmlReader 클래스를 사용할 수 있습니다.

XmlReader 클래스는 스트림 또는 파일에서 XML 데이터를 읽습니다. XML 데이터에 대한 캐시되지 않고 전달 전용, 읽기 전용 액세스를 제공합니다.

전체 파일을 메모리의 XDocument 인스턴스에로드하지 않고 루트 요소 바로 아래에 xs : 시퀀스가 ​​포함 된 큰 XML 파일에서 스트리밍 읽기를 수행하려면 어떻게해야합니까?



Answer #2

나는 "xs : sequence"에 대한 언급으로 혼란 스럽다. 이것은 XML 스키마 요소이다.

큰 XML 스키마 파일을 열려고합니까? 해당 스키마를 기반으로하는 큰 XML 파일을 여실 까? 아니면 큰 XML 파일을 열고 동시에 유효성을 검사하려고합니까?

이러한 상황 중 어느 것도 표준 XmlReader (또는 XmlValidatingReader)를 사용하여 문제를 제공하지 않아야합니다.

XMLReader로 XML 읽기 : http://msdn.microsoft.com/en-us/library/9d83k261(VS.80).aspx


Answer #3

방금 등록 했으므로 주석을 추가 할 수는 없지만 Hirvox에서 게시 한 코드 샘플에는 현재 답변으로 선택되어있어 버그가 있습니다. 정적 Create 메서드를 사용할 때 new 문을 가져서는 안됩니다.

흐름:

using (var reader = new XmlReader.Create(strUrl))

결정된:

using (var reader = XmlReader.Create(strUrl))

Answer #4

SAX 스타일 요소 파서와 XmlReader.Create로 만든 XmlTextReader 클래스를 사용하는 것이 좋습니다. 다음은 CodeGuru 의 약간 수정 된 코드 예제입니다.

void ParseURL(string strUrl)
{
  try
  {
    using (var reader = XmlReader.Create(strUrl))
    {
      while (reader.Read())
      {
        switch (reader.NodeType)
        {
          case XmlNodeType.Element:
            var attributes = new Hashtable();
            var strURI = reader.NamespaceURI;
            var strName = reader.Name;
            if (reader.HasAttributes)
            {
              for (int i = 0; i < reader.AttributeCount; i++)
              {
                reader.MoveToAttribute(i);
                attributes.Add(reader.Name,reader.Value);
              }
            }
            StartElement(strURI,strName,strName,attributes);
            break;
            //
            //you can handle other cases here
            //
            //case XmlNodeType.EndElement:
            // Todo
            //case XmlNodeType.Text:
            // Todo
            default:
            break;
          }
        }
      }
      catch (XmlException e)
      {
        Console.WriteLine("error occured: " + e.Message);
      }
    }
  }
}




streaming