Предположим, у меня есть XML, который выглядит следующим образом:
<Node1>
<ChildNd>
<GrandChildNd>
<a />
<b />
</GrandChildNd>
...
<GrandChildNd>
<b />
<c />
</GrandChildNd>
</ChildNd>
...
</ChildNd>
</Node1>
...
<NodeN>
Другими словами, как и большинство других XML, очень похожая структура между узлами и некоторыми повторяющимися атрибутами / элементами внутри них.
И поскольку большинство моих XML-файлов имеют размер> 200 МБ, я работаю над созданием собственного анализатора с использованием XMLReader, а не более простых моделей XPath / Linq To XML.
При написании этого синтаксического анализатора я обнаружил, что очень сильно полагаюсь на XMLReader.ReadSubTree
, чтобы гарантировать, что я всегда нахожусь в пределах желаемого узла и знаю, что когда я его закрываю, я оказываюсь в конце узла, который анализировал в данный момент.
Так, например, предположим, что я хочу перебрать все <GrandChildNd>
в конкретном <ChildNd>
, я закодировал это примерно так:
Using reader As XmlReader = XmlReader.Create(uri)
reader.ReadToFollowing("Node1")
reader.ReadToDescendant("ChildNd")
reader.ReadStartElement("ChildNd")
' Loop through all the <GrandChildNd>s
Do Until reader.NodeType = XmlNodeType.EndElement
Using GrandChildNdRdr As XmlReader = reader.ReadSubtree
ParseGrandChild(GrandChildNdRdr)
End Using
' Exit current <GrandChildNd>
reader.ReadEndElement()
Loop
End Using
И даже в моем ParseGrandChild
методе я использую еще больше ReadSubTree
вызовов, так как обнаружил, что он гарантирует мне, что я не буду читать ничего за пределами этого текущего узла, и когда я закрываю это вспомогательное средство чтения, он помещает меня в конечный тег узел, который я потреблял.
Из того, что я читал в Интернете, кажется, что метод ReadSubTree
довольно легкий и не плохой в использовании, но мне просто интересно, есть ли, помимо перехода от XPath / Linq к маршруту XML, лучший способ сделать это / Я просто делаю что-то совершенно неправильно.
Для меня это все еще в новинку, поэтому буду благодарен за любые ссылки / примеры !!
Кроме того, я знаю, что этот пример кода был написан на VB.NET, но мне одинаково комфортно работать с решениями C # / VB.NET.
Спасибо!!
ReadSubTree()
или нет. Что касается того, почему я пишу свой собственный синтаксический анализатор, это потому, что файлы ОГРОМНЫ, и даже использование методов объединения XMLReader с любым из этих двух методов все еще убивает меня с точки зрения памяти ... Я написал синтаксический анализатор сейчас, я просто интересно, является ли метод, который я использовал, плохой идеей или не более того, чем использование других методов. Спасибо!! - person John Bustos   schedule 30.10.2014XElement
, а не как весь документ ... Я обнаружил, что это работает очень хорошо. - person Jon Skeet   schedule 03.11.2014Xelement
ужасно, поскольку верхний родитель I Я бы сделал это, потому что у него много дочерних ключей, а его размер составляет ›100 МБ. Моя логика заключалась в том, чтобы рекурсивно использоватьReadSubTree
, чтобы убедиться, что я знаю, где я нахожусь, и не убить свою оперативную память. Имеет ли это смысл? - person John Bustos   schedule 03.11.2014ReadSubTree
по крайней мере ограничивает мою область к любому конкретному узлу, и я могу использовать это рекурсивно, если каждый дочерний элемент имеет ту же структуру, что и родительский. Я просто не был уверен, что это плохая практика ... - person John Bustos   schedule 03.11.2014