Фон
Хотя для вашего вопроса задана кодировка UTF-16, строка не экранирована должным образом, поэтому я не был уверен, действительно ли вы точно перенесли строку в свой вопрос.
Я столкнулся с тем же исключением:
System.Xml.XmlException: данные на
Корневой уровень недействителен. Строка 1,
позиция 1.
Однако мой код выглядел так:
string xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<event>This is a Test</event>";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
Проблема
Проблема заключается в том, что строки хранятся внутри как UTF-16 в .NET, однако кодировка, указанная в заголовке документа XML, может отличаться. E.g.:
<?xml version="1.0" encoding="utf-8"?>
Из документации MSDN для String здесь :
Каждый символ Unicode в строке
определяется скалярным значением Unicode,
также называется кодовой точкой Unicode или
порядковое (числовое) значение
Юникод символ Каждая кодовая точка
кодируется с использованием кодировки UTF-16, и
числовое значение каждого элемента
кодировка представлена символом
объект.
Это означает, что когда вы передаете XmlDocument.LoadXml () вашу строку с заголовком XML, она должна указывать кодировку UTF-16. В противном случае фактическая базовая кодировка не будет соответствовать кодировке, указанной в заголовке, и приведет к возникновению исключения XmlException.
Решение
Решение этой проблемы состоит в том, чтобы убедиться, что кодировка, используемая во всех передаваемых вами методах Load или LoadXml, совпадает с той, что вы говорите в заголовке XML. В приведенном выше примере измените заголовок XML на состояние UTF-16 или закодируйте ввод в UTF-8 и используйте один из XmlDocument.Load методов .
.
Ниже приведен пример кода, демонстрирующий, как использовать MemoryStream для создания XmlDocument с использованием строки, которая определяет XML-документ с кодировкой UTF-8 (но, конечно, хранится строка .NET UTF-16).
string xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<event>This is a Test</event>";
// Encode the XML string in a UTF-8 byte array
byte[] encodedString = Encoding.UTF8.GetBytes(xml);
// Put the byte array into a stream and rewind it to the beginning
MemoryStream ms = new MemoryStream(encodedString);
ms.Flush();
ms.Position = 0;
// Build the XmlDocument from the MemorySteam of UTF-8 encoded bytes
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(ms);