C# 3.5에서 대용량 XML 파일의 스트리밍 읽기를 수행하는 방법
문제
전체 파일을 메모리의 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을 사용합니다.