Невозможно загрузить XmlReader в XDocument
Я пытаюсь загрузить 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>
Ответы
Ответ 1
Эта ошибка подразумевает наличие дополнительных данных после загрузки читателем документа XML. Убедитесь, что ваш XML файл не содержит данных после последнего закрывающего элемента и что инициализируется XmlReader
для чтения из корневого элемента или начала файла, и ничего больше.
Ответ 2
Довольно поздний ответ, если у кого-то такая же проблема.
Вы можете исправить это, используя ReadSubtree()
на ридере, например:
public void ReadXml(System.Xml.XmlReader reader)
{
var doc = XDocument.Load(reader.ReadSubtree());
}
Ответ 3
Еще один поздний ответ, но у меня возникла проблема с обходным решением 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);