XML.LoadData - данные на корневом уровне недопустимы. Строка 1, Позиция 1

Я пытаюсь проанализировать некоторый XML внутри установщика WiX. XML будет объектом всех моих ошибок, возвращаемых с веб-сервера. Я получаю ошибку в заголовке вопроса с этим кодом:

XmlDocument xml = new XmlDocument();
try
{
    xml.LoadXml(myString);
}
catch (Exception ex)
{
    System.IO.File.WriteAllText(@"C:text.txt", myString + "rnrn" + ex.Message);
    throw ex;
}

myString это (как видно из вывода text.txt)

<?xml version="1.0" encoding="utf-8"?>
<Errors></Errors>

text.txt выходит выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<Errors></Errors>

Data at the root level is invalid. Line 1, position 1.

мне нужен этот XML для анализа, чтобы я мог видеть, были ли у меня какие-либо ошибки.

редактировать

этот вопрос не является дубликатом, как отмечено. В этом вопросе человек, задающий вопрос, использовал LoadXml для анализа XML-файла. Я разбираю строку, которая является правильным использованием LoadXml

8 ответов


скрытый символ, вероятно, является BOM. Объяснение проблемы и решение можно найти здесь, кредиты на Джеймса Шуберта, в зависимости от ответа Джеймс Brankin нашел здесь.

хотя предыдущий ответ удаляет скрытый символ, он также удаляет всю первую строку. Более точная версия была бы:

string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
if (xml.StartsWith(_byteOrderMarkUtf8))
{
    xml = xml.Remove(0, _byteOrderMarkUtf8.Length);
}

я столкнулся с этой проблемой при извлечении файла XSLT из Azure blob и загрузке его в Объект XslCompiledTransform. На моей машине файл выглядел просто отлично, но после загрузки его как blob и возврата его, был добавлен символ BOM.


использовать Load() метод вместо этого, он решит проблему. Посмотреть подробнее


проблема здесь была в том, что myString была эта строка заголовка. Либо в начале первой строки был какой-то скрытый символ, либо сама строка вызывала ошибку. Я отрезал первую строчку вот так:--3-->

xml.LoadXml(myString.Substring(myString.IndexOf(Environment.NewLine)));

это решило мою проблему.


Я думаю, что проблема заключается в кодировании. Вот почему удаление первой строки (с байтом кодирования) может решить проблему.

мое решение для данные на корневом уровне, является недействительным. Строка 1, Позиция 1. в XDocument.Parse(xmlString) заменял его на XDocument.Load( new MemoryStream( xmlContentInBytes ) );

Я заметил, что моя строка xml выглядела нормально:

<?xml version="1.0" encoding="utf-8"?>

но в другой кодировке текстового редактора это выглядело так:

?<?xml version="1.0" encoding="utf-8"?>

в конце мне не нужна строка xml, но xml байт.][ Если вам нужно использовать строку, вы должны искать "невидимые" байты в своей строке и играть с кодировками, чтобы настроить содержимое xml для синтаксического анализа или загрузки.

надеюсь, это поможет


Я решил эту проблему, непосредственно отредактировав массив байтов. Соберите преамбулу UTF8 и удалите непосредственно заголовок. После этого вы можете преобразовать byte[]в строку с помощью метода GetString, см. ниже. \R и \t я также удалил, просто в качестве меры предосторожности.

XmlDocument configurationXML = new XmlDocument();
List<byte> byteArray = new List<byte>(webRequest.downloadHandler.data);

foreach(byte singleByte in Encoding.UTF8.GetPreamble())
{
     byteArray.RemoveAt(byteArray.IndexOf(singleByte));
}
string xml = System.Text.Encoding.UTF8.GetString(byteArray.ToArray());
       xml = xml.Replace("\r", "");
       xml = xml.Replace("\t", "");

сохраните файл с другой кодировкой:

Файл > Сохранить файл как... > Сохранить как UTF-8 без подписи.

в VS 2017 вы найдете кодировку в виде выпадающего списка рядом с кнопкой Сохранить.


Если ваш xml находится в строке, используйте следующее, Чтобы удалить любую метку порядка байтов:

        xml = new Regex("\<\?xml.*\?>").Replace(xml, "");

Я нашел одно из решений. Для вашего кода, это может быть следующим образом -

XmlDocument xml = new XmlDocument();
try
{
    // assuming the location of the file is in the current directory 
    // assuming the file name be loadData.xml
    string myString = "./loadData.xml";
    xml.Load(myString);
}
catch (Exception ex)
{
    System.IO.File.WriteAllText(@"C:\text.txt", myString + "\r\n\r\n" + ex.Message);
    throw ex;
}