2009-07-15 7 views
15

J'essaie de charger un XmlReader dans un XDocument pour faciliter la manipulation. Le XML est bien formé et valide (je double revu). Lorsque je tente de le charger dans le XDocument, je reçois un InvalidOperationExceptionImpossible de charger XmlReader dans XDocument

The XmlReader state should be EndOfFile after this operation.

le code pour charger c'est

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

J'ai inclus un échantillon de XML qui cause le problème. Je peux sérialiser et désérialiser cette classe sans problème, mais pas la charger. Des idées?

<?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

Il n'y a rien de mal avec cet extrait. Pourriez-vous publier le code où vous instancier le XmlReader et appeler la méthode ReadXml? –

+0

Veuillez montrer le code d'appel, et montrer l'exception complète. –

+0

Veuillez également montrer le code que vous utilisez pour créer ce 'XmlReader' que vous passez à' XDocument.Load'. –

Répondre

4

Cette erreur implique qu'il existe des données supplémentaires après que le lecteur a chargé ce qu'il pense être un document XML. Vérifiez que votre fichier XML ne contient aucune donnée après l'élément de fermeture final et que le XmlReader est initialisé pour lire à partir de l'élément racine ou du début du fichier, et rien d'autre.

35

Réponse assez tardive, au cas où quelqu'un aurait le même problème. Vous pouvez le fixer à l'aide ReadSubtree() sur le lecteur, comme:

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

Une autre réponse tardive, mais je suis tombé sur un problème avec la solution de contournement reader.ReadSubtree() et cela a fini par travailler pour ma situation. L'approche de base est la lecture dans une chaîne, puis l'appel 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

Cette solution me renvoie une erreur: 'Cette opération crée un document structuré de manière incorrecte' – mggSoft

+0

Votre code XML peut être incorrect dans ce cas. – Colin

Questions connexes