#c# #.net #xml
#c# #.net #xml
Вопрос:
У меня есть следующая функция:
public static XmlNode GetXMLNodeFromString(string strXML)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(strXML);
return doc.DocumentElement;
}
который может быть вызван миллион раз в строке кода, которая возвращается из вызова базы данных:
while (reader.Read())
{
myXMLList.Add(GetXMLNodeFromString((string)reader["GMLString"]));
}
Есть ли лучший способ, чем продолжать создавать экземпляр XmlDocument для каждой строки? Или это нормально для этого?
Я не хочу этого:
XmlDocument doc = new XmlDocument();
while (reader.Read())
{
myXMLList.Add(doc, GetXMLNodeFromString((string)reader["GMLString"]));
}
потому что во всей реальности существует дерево функций, к которому я должен был бы его добавить. Не просто GetXMLNodeFromString .
Могу ли я сделать что-то вроде этого:
public static class Common
{
public static XmlDocument doc = new XmlDocument();
public static XmlNode GetXMLNodeFromString(string strXML)
{
doc.LoadXml(strXML);
return doc.DocumentElement;
}
}
Что мне делать?
Комментарии:
1. Вероятно, вам следует прекратить так часто использовать static . Создайте свой собственный класс, создайте XmlDocument в конструкторе, чтобы сделать это только один раз.
Ответ №1:
Я рекомендую XmlReader, если у вас проблемы с производительностью, поскольку он позволяет вам анализировать XML по мере его поступления, а не предварительно анализировать его и создавать объектную модель в памяти, к которой вам все равно придется возвращаться. Однако это может потребовать некоторой реструктуризации вашего кода, поскольку это дает вам последовательный (в отличие от случайного) доступ. Если вам не нужен произвольный доступ, это хороший выбор.
Комментарии:
1. Все найденные мной примеры создания XMLElements или узлов из строки с использованием XmlReader в любом случае требовали использования экземпляра XmlDocument. У вас есть пример?
2. @capdragon, идея в том, что вы вообще не будете создавать экземпляр XmlElement или XmlNode, а скорее будете считывать нужные вам XML-данные непосредственно из потока, выполняя собственное согласование формата и порядка. Это менее удобно, но выполняется значительно быстрее, чем создание полностью проанализированной объектной модели с помощью XmlDocument. Я бы пошел по этому пути только в том случае, если у вас проблемы с производительностью.
3. Я понимаю. Ну, у меня нет проблем с производительностью, потому что сейчас я имею дело только с несколькими тысячами. Но ожидается, что число моих просмотров превысит миллион. Думаю, тогда я передам мост. И я думаю, мне следовало пояснить: это часть службы WCF, которая возвращает XML / GML. Итак, я извлекаю GML и предоставляю его клиенту. Мне не нужно было бы выполнять какое-либо чтение, форматирование или упорядочивание.
Ответ №2:
Мы нашли XmlDocument вялым, но только потому, что мы выводим его за рамки его дизайна. Однако создание экземпляра по одному для каждой строки таблицы вызовет у вас серьезные проблемы. Это класс тяжеловесов, созданный для манипуляций на месте — в чем он очень хорош, — и если вы создаете и уничтожаете их быстрее, чем человек может сосчитать в уме, вы переутомляетесь.
Ответ №3:
Я столкнулся с проблемой производительности, с которой вы можете столкнуться. Был цикл foreach, который использовал XmlDocument для чтения xml из файлов. Экземпляр XmlDocument был создан вне цикла. После обработки 300 000 файлов производительность постоянно и неуклонно снижалась. Создание экземпляра XmlDocument внутри цикла решило проблему. Я бы никогда не ожидал такого поведения, но я измерил его и видел своими глазами.
Пожалуйста, обратите внимание, что вам нужно протестировать свой собственный случай. Рассмотрим:
- такое поведение может зависеть от структуры xml
- может быть, вы можете использовать XmlReader
- опыт, о котором я писал, относится к .NET 2.0
Я предлагаю переписать ваш код, чтобы использовать XmlReader, потому что XmlDocument предназначен для манипуляций. Вероятно, вам не нужно читать миллионы строк с помощью XmlDocument, а затем обрабатывать 0 или всего несколько XmlDocuments.