Какой самый быстрый способ удалить узлы из большого файла XML с помощью .net - PullRequest
2 голосов
/ 11 января 2010

Я работаю с очень большими XML-файлами (100 МБ). Дерево довольно простое

<items>
  <item>
    <column1>ABC</column1>
    <column2>DEF</column2>
  </item>
  <item>
    <column1>GHI</column1>
    <column2>KLM</column2>
  </item>
</items>

Мне нужно проанализировать этот документ и удалить некоторые элементы <item>. До сих пор лучшее, что я достиг, это использование XmlReader, кэширование каждого <item> в памяти и запись его обратно с использованием XmlWriter, если он соответствует критериям, и просто игнорирование, если это не так. Есть ли что-нибудь, что я могу сделать, чтобы сделать это быстрее?

Ответы [ 3 ]

1 голос
/ 11 января 2010

Вы можете сохранить шаг, реализовав подкласс XmlReader, метод которого Read пропускает элементы item, которые вас не интересуют. Сейчас у вас, кажется, есть два шага: чтение и фильтрация документ с XmlReader и последующим использованием XmlWriter, чтобы записать его в то, что вы, вероятно, затем прочитаете. Подклассы XmlReader исключают этот второй шаг; вы используете подкласс XmlReader в качестве входных данных для вашего преобразования XSLT или XmlDocument или что-то еще, и оно никогда не создает промежуточное представление отфильтрованного XML-документа.

0 голосов
/ 11 января 2010

посмотрите, можете ли вы использовать xpath-запросы, чтобы определить, что вы хотите и не хотите читать с этим объектом xmldocument .... посмотрите следующие методы этого класса SelectSingleNode (), который возвращает объект XmlNode ... SelectNodes (), который возвращает объект XmlNodeList .... посмотрим, поможет ли это ....

0 голосов
/ 11 января 2010

Вы можете использовать сценарии perl или shell для замены необходимых элементов, если вы можете написать быстрое регулярное выражение, чтобы избавиться от него. Это позволило бы не загружать все это в память и не записывать обратно.

...