문제

전체 파일을 메모리의 XDocument 인스턴스에 로드하지 않고 루트 요소 바로 아래에 xs:sequence가 포함된 대규모 XML 파일에서 스트리밍 읽기를 어떻게 수행할 수 있습니까?

도움이 되었습니까?

해결책

SAX 스타일 요소 파서를 사용하고 XmlTextReader 다음으로 생성된 클래스 XmlReader.Create 좋은 생각이겠죠, 그렇죠.다음은 약간 수정된 코드 예제입니다. 코드구루:

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);
      }
    }
  }
}

다른 팁

방금 가입했지만 Hirvox에서 게시하고 현재 답변으로 선택한 코드 샘플에 버그가 있기 때문에 댓글을 추가할 수 없습니다.그것은 new 정적을 사용할 때의 진술 Create 방법.

현재의:

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

결정된:

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

객체 모델(예:XElement\XDocument)를 사용하여 XML을 쿼리합니다.분명히 충분한 데이터를 읽지 않으면 XML 개체 트리를 만들 수 없습니다.그러나 당신은 사용할 수 있습니다 XmlReader 수업.

XMLREADER 클래스는 스트림 또는 파일에서 XML 데이터를 읽습니다.XML 데이터에 대한 부시가 아닌 전방 전용 읽기 전용 액세스를 제공합니다.

방법은 다음과 같습니다. http://support.microsoft.com/kb/301228/en-us XmlTextReader를 사용하지 말고 대신 XmlReader.Create와 함께 XmlReader를 사용해야 한다는 점을 기억하세요.

"xs:sequence"에 대한 언급이 혼란스럽습니다. 이것은 XML 스키마 요소입니다.

큰 XML 스키마 파일을 열려고 합니까?해당 스키마를 기반으로 하는 대용량 XML 파일을 열고 있습니까?아니면 대용량 XML 파일을 열고 동시에 유효성을 검사하려고 하시나요?

이러한 상황에서는 표준 XmlReader(또는 XmlValidatingReader)를 사용하는 데 문제가 발생하지 않습니다.

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

해당 코드 샘플은 XmlReader 스타일 코드를 SAX 스타일 코드로 바꾸려고 시도합니다. 코드를 처음부터 작성하는 경우 XmlReader를 의도한 대로 사용합니다. Push가 아닌 Pull을 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top