XDocument: возможно ли принудительно загрузить искаженный XML-файл? - PullRequest
5 голосов
/ 18 апреля 2011

У меня поврежденный файл XML.Корневой тег не закрыт тегом.Последний тег отсутствует.

Когда я пытаюсь загрузить искаженный XML-файл в C #

StreamReader sr = new StreamReader(path);
batchFile = XDocument.Load(sr); // Exception

, я получаю исключение " Произошел неожиданный конец файла. Следующие элементыне закрыты: партия. Строка 54, позиция 1."

Возможно ли игнорировать закрывающий тег или форсировать загрузку?Я заметил, что все мои инструменты XML ((например, блокнот XML)) автоматически исправляют или игнорируют проблему.Я не могу исправить файл XML.Это один экземпляр стороннего программного обеспечения, и иногда файл верный.

Ответы [ 3 ]

4 голосов
/ 18 апреля 2011

Вы не можете сделать это с XDocument, потому что этот класс загружает весь документ в память и анализирует его полностью.
Но возможно обработать документ с помощью XmlReader, это заставит вас прочитать и обработать полный документ, и в конце вы получите исключение отсутствующего тега.

3 голосов
/ 18 апреля 2011

Я предлагаю использовать Tidy.NET для очистки беспорядочного ввода

Tidy.NET имеет хороший API для получения списка проблем (MessageCollection) в вашем «XML», и вы можете использовать его для исправления текстового потока в памяти. Простейшей вещью было бы исправление одной ошибки за раз, считая, что при многих ошибках она не будет работать слишком хорошо. В противном случае вы можете исправить ошибки в обратном порядке документов, чтобы смещения сообщений оставались действительными при выполнении исправлений

Вот пример для преобразования ввода HTML в XHTML:

Tidy tidy = new Tidy ();

/* Set the options you want */
tidy.Options.DocType = DocType.Strict;
tidy.Options.DropFontTags = true;
tidy.Options.LogicalEmphasis = true;
tidy.Options.Xhtml = true;
tidy.Options.XmlOut = true;
tidy.Options.MakeClean = true;
tidy.Options.TidyMark = false;

/* Declare the parameters that is needed */
TidyMessageCollection tmc = new TidyMessageCollection();
MemoryStream input = new MemoryStream();
MemoryStream output = new MemoryStream();

byte[] byteArray = Encoding.UTF8.GetBytes("Put your HTML here...");
input.Write(byteArray, 0 , byteArray.Length);
input.Position = 0;
tidy.Parse(input, output, tmc);

string result = Encoding.UTF8.GetString(output.ToArray());
1 голос
/ 18 апреля 2011

Что вы можете сделать, это добавить закрывающий тег в XML-файл в памяти и затем загрузить его.

Таким образом, после загрузки XML в потоковый ридер, манипулируйте данными перед загрузкой XML

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...