2009-07-15 55 views
15

我試圖將XmlReader加載到XDocument中以便於操作。 XML格式正確並且有效(我重複檢查)。當我試圖將其加載到XDocument,我得到一個InvalidOperationException無法將XmlReader加載到XDocument中

The XmlReader state should be EndOfFile after this operation.

加載該代碼是

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

我已經包括引起該問題的XML的一個樣本。我可以序列化和反序列化這個類沒有問題,但不加載它。有任何想法嗎?

<?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方法的地方發佈代碼嗎? – 2009-07-15 20:09:40

+0

請顯示撥打電話的代碼,並顯示完整的例外情況。 – 2009-07-15 20:09:57

回答

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