2009-11-19 2 views
1

Скажем, мне нужно найти определенный узел в файле XML с помощью C#.Найти узел в файле XML - повышение производительности в C#

<node attribute="my-target-attribute"> 

"my-target-attribute" - это переменный ввод во время выполнения.

Узел не имеет особого места в XML-файле, мне просто нужно всего лишь проверить всю иерархию XML, пока не найду узел с соответствующим атрибутом.

Есть ли способ, которым я могу предварительно обработать XML, чтобы найти узел быстрее? Мне нужно сохранить исходную структуру XML на месте. Файл XML может иметь 10 000 узлов.

+0

Существует два разных сценария: один из них заключается в том, что вы загружаете XML в память один раз, а затем повторно выполняете поиск в представлении в памяти ('XmlDocument',' XPathDocument', 'XDocument' и т. Д.). Другое дело, что вы должны загружать документ из файла каждый раз, когда вам нужно выполнить поиск. Который твой? –

+0

Я открыт для любой реализации. Другим вариантом может быть предварительная обработка файла и загрузка его содержимого в базу данных. – frankadelic

+0

Вам нужно получить узел XML специально (например, потому что вы передадите его другому API-интерфейсу обработки XML, например, XslCompiledTransform) или только некоторые данные, хранящиеся в нем? Если последний, какие данные (просто строка, куча случайных значений, дерево узлов ...)? –

ответ

4

Вы, конечно, можете Обрабатывает XML, чтобы сделать Lookups быстрее:

Dictionary<string, XmlElement> elementMap = new Dictionary<string, XmlElement>(); 
AddElementToMap(doc.DocumentElement, elementMap); 
... 
private void AddElementToMap(XmlElement elm, Dictionary<string, XmlElement> elementMap) 
{ 
    elementMap[elm.GetAttribute("attribute")] = elm; 
    foreach (XmlElement child in elm.SelectNodes("node")) 
    { 
     AddElementToMap(child, elementMap); 
    } 
} 

После того, как вы сделали это, если поиск прост:

XmlElement elm = elementMap[value]; 

Этот код предполагает, что каждый элемент вашего документа называется «узлом», каждый имеет атрибут с именем «атрибут» и что все значения атрибутов уникальны. Код более сложный, если какое-либо из этих условий неверно, но не в исключительных случаях.

1

Вы можете использовать xslt для преобразования xml, чтобы узел находился на известной глубине. Затем, когда вы выбираете с XPath, вы можете выбрать соответственно без использования оператора //.

+0

Одна из причин, почему это может не работать для меня ... мои узлы все называются . Таким образом, мой XPATH будет: /node/node/node/node/[@ attribute = 'my-target-attribute'] – frankadelic

+0

thats довольно сложная структура xml –

0

похоже на другой ответ, вы можете использовать xpath аналогично selectNodes("//[@attribute='my-target-attribute']"). // будет искать узлы на всех уровнях глубины.

Смежные вопросы