C # xml чтение / запись / xpath без использования XmlDocument - PullRequest
3 голосов
/ 01 октября 2009

Я выполняю рефакторинг некоторого кода в существующей системе. Цель состоит в том, чтобы удалить все экземпляры XmlDocument, чтобы уменьшить объем используемой памяти. Тем не менее, мы используем XPath для управления xml, когда применяются определенные правила. Есть ли способ использовать XPath без использования класса, который загружает весь документ в память? Мы заменили все остальные экземпляры на XmlTextReader, но они работали только потому, что XPath отсутствует, а чтение очень простое.

Некоторые XPath используют значения других узлов для принятия решения. Например, значение узла сообщения может быть основано на значении узла суммы, поэтому необходимо обращаться к нескольким узлам одновременно.

Ответы [ 4 ]

3 голосов
/ 01 октября 2009

Если ваше выражение XPATH основано на доступе к нескольким узлам, вам просто нужно будет прочитать XML в DOM. Хотя две вещи. Во-первых, вам не нужно читать все этого в DOM, только ту часть, которую вы запрашиваете. Во-вторых, какая DOM вы используете, имеет значение; XPathDocument предназначен только для чтения и настроен на скорость запросов XPATH, в отличие от более общего, но дорогого XmlDocument.

1 голос
/ 01 октября 2009

Я полагаю, что использование System.Xml.Linq.XDocument также запрещено? В противном случае это был бы хороший выбор, так как он быстрее, чем XmlDocument (насколько я помню).

0 голосов
/ 16 ноября 2011

Способ сделать это - использовать XPathDocument, который может принимать поток, поэтому вы можете использовать StringReader.

Возвращает значение в режиме прямого чтения без дополнительных затрат на загрузку всего XML DOM в память с помощью XmlDocument.

Вот пример, который возвращает значение первого узла, удовлетворяющего запросу XPath:

public string extract(string input_xml)
    {
        XPathDocument document = new XPathDocument(new StringReader(input_xml));
        XPathNavigator navigator = document.CreateNavigator();
        XPathNodeIterator node_iterator = navigator.Select(SEARCH_EXPRESSION);
        node_iterator.MoveNext();
        return node_iterator.Current.Value;
    }
0 голосов
/ 01 октября 2009

Поддержка XPath означает поддержку запросов, таких как:

//address[/states/state[@code=current()/@code]='California']

или

//item[@id != preceding-sibling/item/@id]

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

...