У меня есть большие пакеты файлов XHTML, которые вручную обновляются. Во время фазы обзора обновлений я хотел бы программно проверить отмеченность файлов. Я в настоящее время использую XmlReader, но время, требуемое на среднем ЦП, намного дольше, чем я ожидал.
Диапазон файлов XHTML в размере от 4 КБ до 40 КБ и проверке занимает несколько секунд на файл. Проверка важна, но я хотел бы сохранить время максимально коротким, поскольку проверка выполнена, в то время как файлы читаются в следующий этап процесса.
Существует ли более быстрый способ сделать простую проверку отмеченности XML? Возможно, пользуясь внешними библиотеками XML?
Я могу подтвердить, что, проверяя "регулярный" XML основанное содержание является молнией быстро с помощью XmlReader, и, как предложено проблема, кажется, связана с тем, что DTD XHTML читается каждый раз, когда файл проверен.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Обратите внимание, что в дополнение к DTD, соответствующие .ent файлы (xhtml-lat1.ent, xhtml-symbol.ent, xhtml-special.ent) также загружаются.
Начиная с игнорирования DTD полностью не действительно опция для XHTML, поскольку отмеченность тесно связана с позволенными объектами HTML (например, быстро представит ошибки проверки, когда мы проигнорируем DTD).
Проблема была решена при помощи пользовательского XmlResolver, как предложено, в сочетании с локальными (встроенными) копиями и DTD и файлов объекта.
Я отправлю решение здесь, после того как я очистил код
Я ожидал бы это XmlReader
с while(reader.Read)() {}
был бы самый быстрый управляемый подход. Конечно, не должны требоваться секунд для чтения 40 КБ..., каков входной подход, который Вы используете?
У Вас, возможно, есть некоторые внешними (схема и т.д.) объекты для разрешения? Если так, Вы смогли писать пользовательское XmlResolver
(набор через XmlReaderSettings
) это использует локально кэшируемые схемы, а не удаленную выборку...
Следующее делает ~300KB фактически немедленно:
using(MemoryStream ms = new MemoryStream()) {
XmlWriterSettings settings = new XmlWriterSettings();
settings.CloseOutput = false;
using (XmlWriter writer = XmlWriter.Create(ms, settings))
{
writer.WriteStartElement("xml");
for (int i = 0; i < 15000; i++)
{
writer.WriteElementString("value", i.ToString());
}
writer.WriteEndElement();
}
Console.WriteLine(ms.Length + " bytes");
ms.Position = 0;
int nodes = 0;
Stopwatch watch = Stopwatch.StartNew();
using (XmlReader reader = XmlReader.Create(ms))
{
while (reader.Read()) { nodes++; }
}
watch.Stop();
Console.WriteLine("{0} nodes in {1}ms", nodes,
watch.ElapsedMilliseconds);
}
Создайте XmlReader
объект путем передачи в XmlReaderSettings
объект, который имеет ConformanceLevel.Document
.
Это проверит отмеченность.
Эта статья MSDN должна объяснить детали.
На моем довольно обычном ноутбуке, читая 250K XML-документ от начала до конца с XmlReader
берет 6 миллисекунд. Что-то еще помимо просто парсинга XML является преступником.
Лично, я довольно ленив..., таким образом, я ищу библиотеки.NET, которые уже решают проблему. Попытайтесь использовать DataSet.ReadXML()
функционируйте и поймайте исключения. Это делает довольно удивительное задание объяснения ошибок формата XML.
Как другие упомянули, узкое место наиболее вероятно не XmlReader.
Проверьте, сделали ли бы Вы, оказалось, не большую конкатенацию строк без stringbuilder.
Это может действительно уничтожить Вашу производительность.