2015-05-20 3 views
0

У меня есть файл размером 200 Мбайт, который мне нужен для циклического перехода и получения всех уникальных xpath. При такой установке:Большой файл XML, взорвавший память, как я могу уменьшить?

<?xml version="1.0" encoding="utf-8"?> 
<invoice> 
    <id>123</id> 
    <newRa elem="0"> 
     <createD>20150519</createD> 
     <modD>12345</modD> 
    </newRa> 
    <total>123.99</total> 
</invoice> 
<invoice> 
    <id>456</id> 
    <newRa elem="0"> 
     <createD>20150518</createD> 
     <modD>12345</modD> 
    </newRa> 
    <total>456.99</total> 
</invoice> 
<invoice> 
    <id>789</id> 
    <newRa elem="0"> 
     <createD>20150517</createD> 
     <modD>12345</modD> 
    </newRa> 
    <total>789.99</total> 
</invoice> 

Я хочу запустить через каждый фактуру один раз, получить список уникальных XPaths, и хранить их в StringCollection.

Поскольку я просматриваю все элементы счета, я хочу добавить к stringcollection ТОЛЬКО при встрече с новым xpath.

Из-за определенных ограничений (то есть VisualStudio2005, .NET 2.0 Framework), которые не могут использовать LINQ и многие другие функции, которые могут легко решить это для меня, мне стало сложно оборачивать голову.

+0

Итак ... каков ваш вопрос? –

+0

Что означает «новый xpath»? – rheitzman

ответ

2

Для таких файлов вы должны создать класс парсера на основе XmlTextReader. Это реализация синтаксического анализа.

С помощью XmlTextReader вы должны прочитать весь узел XML узлом и извлечь содержимое, необходимое для вашей задачи. Здесь вам придется самостоятельно построить строку запроса XPath, отслеживая вложенные элементы и количество позиций.

+0

Определенно. Я бы добавил, что «HashSet» - это очевидный подход для хранения этих XPath, так как querent хочет хранить только уникальные значения, и это автоматически игнорирует дубликаты. 'HashSet' не появлялся до 3,5, но не сложно написать свои собственные. –

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