Перед объявлением кодировки <?xml ?>
, кроме спецификации, не должно быть текста или пробелов, а между объявлением и корневым элементом, кроме разрыва строки, не должно быть текста.
Все остальное является недействительным документом.
UPDATE:
Я думаю, что ваше ожидание XmlTextReader.read () неверно.
Каждый вызов XmlTextReader.Read () проходит по следующему «токену» в документе XML, по одному токену за раз. «Токен» означает элементы XML, пробелы, текст и объявление кодировки XML .
Ваш вызов reader.ReadOuterXML () возвращает пустую строку, потому что первый токен в вашем XML-файле является объявлением XML, а объявление XML не имеет OuterXML.
Рассмотрим этот код:
XmlTextReader reader = new XmlTextReader("test.xml");
reader.Read();
Console.WriteLine(reader.NodeType); // XMLDeclaration
reader.Read();
Console.WriteLine(reader.NodeType); // Whitespace
reader.Read();
Console.WriteLine(reader.NodeType); // Element
string rs = reader.ReadOuterXml();
Приведенный выше код дает такой вывод:
XmlDeclaration
Whitespace
Element
Первым «токеном» является объявление XML.
Второй встреченный «токен» - это разрыв строки после объявления XML.
Третий встреченный "токен" - это элемент <s:Envelope>
. Отсюда вызов метода reader.ReadOuterXML () вернет то, что, я думаю, вы ожидаете увидеть - текст элемента <s:Envelope>
, который является целым пакетом мыла.
Если вы действительно хотите загрузить XML-файл в память как объекты, просто вызовите
var doc = XDocument.Load("test.xml")
и сделать разбор одним махом.
Если вы не работаете с документом XML, который настолько чудовищен, что не помещается в системную память, на самом деле не так уж много причин просматривать документ XML по одному токену за раз.