Не удается загрузить XmlReader в XDocument - PullRequest
15 голосов
/ 16 июля 2009

Я пытаюсь загрузить XmlReader в XDocument для более легкой манипуляции. XML хорошо сформирован и действителен (я дважды проверил). Когда я пытаюсь загрузить его в XDocument, я получаю InvalidOperationException

После этой операции состояние XmlReader должно быть EndOfFile.

код для загрузки это

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>

Ответы [ 3 ]

36 голосов
/ 01 апреля 2011

Довольно поздний ответ, если у кого-то возникла такая же проблема. Вы можете исправить это, используя ReadSubtree() на считывателе, например:

public void ReadXml(System.Xml.XmlReader reader)
{
     var doc = XDocument.Load(reader.ReadSubtree());
}
4 голосов
/ 16 июля 2009

Эта ошибка подразумевает наличие дополнительных данных после того, как читатель загрузит то, что он считает XML-документом. Убедитесь, что ваш XML-файл не содержит данных после последнего закрывающего элемента и что XmlReader инициализируется для чтения из корневого элемента или начала файла и ничего больше.

0 голосов
/ 24 января 2015

Еще один поздний ответ, но я столкнулся с проблемой с обходным решением 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); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...