2009-07-15 4 views
15

간편한 조작을 위해 XmlReaderXDocument에로드하려고합니다. XML은 잘 형성되고 유효합니다 (이중 체크). 나는 시도하고 XDocument에로드 할 때,이를로드 할 InvalidOperationExceptionXDocument에 XmlReader를로드 할 수 없습니다.

The XmlReader state should be EndOfFile after this operation.

코드가 나는 문제를 일으키는 XML의 샘플을 포함 시켰습니다

public void ReadXml(System.Xml.XmlReader reader) 
{ 
    var doc = XDocument.Load(reader); 
} 

입니다 얻을. 이 클래스를 문제없이 직렬화 및 비 직렬화 할 수는 있지만로드 할 수는 없습니다. 어떤 아이디어?

<?xml version="1.0" encoding="utf-8"?> 
<ForestView xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<Forest> 
<TreeNodeView> 
    <Level>Master</Level> 
    <ID>39476b1f-e2f8-4d76-b82e-a5166899ad43</ID> 
    <Name>Black Mesa</Name> 
    <ServerIPAddress>127.0.0.1</ServerIPAddress> 
    <ServerPortNumber>8000</ServerPortNumber> 
    <ClientIPAddress>NA</ClientIPAddress> 
    <ClientPortNumber>4000</ClientPortNumber> 
    <Nodes> 
    <Level>Server</Level> 
    <NodeID>062c3e03-235d-4d7d-9b60-c6228c9cc89e</NodeID> 
    <Name /> 
    <ServerIPAddress>127.0.0.1</ServerIPAddress> 
    <ServerPortNumber>5000</ServerPortNumber> 
    <ClientIPAddress>127.0.0.1</ClientIPAddress> 
    <ClientPortNumber>4000</ClientPortNumber> 
    </Nodes> 
    <Nodes> 
    <Level>Intermediate</Level> 
    <NodeID>9bafdc9e-771e-42cf-8f03-e7e75a67a6d1</NodeID> 
    <Name>Jen</Name> 
    <ServerIPAddress>127.0.0.1</ServerIPAddress> 
    <ServerPortNumber>8001</ServerPortNumber> 
    <ClientIPAddress>127.0.0.1</ClientIPAddress> 
    <ClientPortNumber>8000</ClientPortNumber> 
    <Nodes> 
     <Level>Terminal</Level> 
     <NodeID>72509141-0ab8-45c1-8042-30afb233b4a8</NodeID> 
     <Name>Mary</Name> 
     <ServerIPAddress>127.0.0.1</ServerIPAddress> 
     <ServerPortNumber>0</ServerPortNumber> 
     <ClientIPAddress>127.0.0.1</ClientIPAddress> 
     <ClientPortNumber>8001</ClientPortNumber> 
    </Nodes> 
    </Nodes> 
    </TreeNodeView> 
</Forest> 
</ForestView> 
+0

이 스 니펫에는 아무 문제가 없습니다. XmlReader를 인스턴스화하고 ReadXml 메서드를 호출하는 코드를 게시 할 수 있습니까? –

+0

전화를 건 코드를 보여주고 전체 예외를 보여주십시오. –

+0

'XDocument.Load'에 넘겨주는'XmlReader'를 만들기 위해 사용하는 코드도 보여주십시오. –

답변

4

이 오류는 독자가 XML 문서라고 생각하는 것을로드 한 후 추가 데이터가 있음을 의미합니다. XML 파일에 마지막 닫는 요소 다음에 데이터가 없으며 XmlReader이 루트 요소 또는 파일의 시작 부분에서 읽도록 초기화되어 있는지 확인하십시오.

35

누군가가 동일한 문제를 가지고있는 경우를 대비하여 꽤 늦은 답변입니다. 당신처럼, 독자에 ReadSubtree()를 사용하여 문제를 해결할 수 있습니다

public void ReadXml(System.Xml.XmlReader reader) 
{ 
    var doc = XDocument.Load(reader.ReadSubtree()); 
} 
0

또 다른 늦게 대답,하지만 난 reader.ReadSubtree() 해결 방법에 문제로 실행하고이 내 상황 일 끝났다. 기본 접근법은 문자열로 읽은 다음 XDocument.Parse()을 호출하는 것입니다.

XDocument doc; 
var textReader = reader as XmlTextReader; 
if (textReader != null) 
{ 
    var xml = textReader.ReadOuterXml(); 
    doc = XDocument.Parse(xml); 
} 
else 
    doc = XDocument.Load(reader); 
+0

이 솔루션은 다음과 같은 오류 메시지를 표시합니다. '이 작업은 잘못 구성된 문서를 만듭니다. – mggSoft

+0

이 경우 XML이 잘못되었을 수 있습니다. – Colin

관련 문제