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 + "\r\n\r\n" + 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 для синтаксического анализа, чтобы я мог видеть, были ли у меня какие-либо ошибки.
Edit
Этот вопрос не является дубликатом, как отмечено. В этом вопросе человек, задающий вопрос, использовал LoadXml
для анализа XML файла. Я разбираю строку, которая является правильным использованием LoadXml
Ответы
Ответ 1
Скрытый символ - это, вероятно, спецификация.
Объяснение проблемы и решение можно найти здесь, кредиты Джеймсу Шуберту, основанные на ответе Джеймса Бранкина, нашли .
Хотя предыдущий ответ удаляет скрытый символ, он также удаляет всю первую строку. Более точная версия:
string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
if (xml.StartsWith(_byteOrderMarkUtf8))
{
xml = xml.Remove(0, _byteOrderMarkUtf8.Length);
}
Я столкнулся с этой проблемой при извлечении XSLT файла из Azure blob и загрузке его в объект XslCompiledTransform.
На моей машине файл выглядел просто отлично, но после загрузки его в виде капли и получения его назад был добавлен символ спецификации.
Ответ 2
Вместо этого используйте метод Load()
, это решит проблему. Узнать больше
Ответ 3
Проблема заключалась в том, что myString
имела эту строку заголовка. Либо был скрытый символ в начале первой строки, либо сама строка вызывала ошибку. Я отрезал первую строку следующим образом:
xml.LoadXml(myString.Substring(myString.IndexOf(Environment.NewLine)));
Это решило мою проблему.
Ответ 4
Я думаю, что проблема в кодировании. Поэтому устранение первой строки (с байтом кодирования) может решить проблему.
Мое решение для Данные на корневом уровне недопустимы. Строка 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 byte []. Если вам нужно использовать строку, вы должны искать "невидимые" байты в своей строке и играть с кодировками, чтобы настроить содержимое xml для синтаксического анализа или загрузки.
Надеюсь, что это поможет
Ответ 5
Я решил эту проблему путем непосредственного редактирования байтового массива. Соберите преамбулу UTF8 и удалите непосредственно заголовок. После этого вы можете преобразовать byte [] в строку с помощью метода GetString, см. Ниже. Я тоже удалил, так же, как предосторожность.
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", "");
Ответ 6
Сохраните файл с другой кодировкой:
Файл > Сохранить файл как... > Сохранить как UTF-8 без подписи.
В VS 2017 вы найдете кодировку как раскрывающийся список рядом с кнопкой "Сохранить".
Ответ 7
Если ваш xml находится в строке, используйте следующую команду для удаления любой метки порядка байтов:
xml = new Regex("\\<\\?xml.*\\?>").Replace(xml, "");
Ответ 8
Я нашел одно из решений. Для вашего кода это может быть следующим:
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;
}