Xml Node List. Count Property
Namespace: System.Xml Assemblies: System.Xml.dll, System.Xml.XmlDocument.dll Assembly: System.Xml.ReaderWriter.dll Assembly: System.Xml.XmlDocument.dll Assembly: System.Xml.dll Assembly: netstandard.dll
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Gets the number of nodes in the XmlNodeList .
public: abstract property int Count < int get(); >;
public abstract int Count
member this.Count : int
Public MustOverride ReadOnly Property Count As Integer
Property Value
The number of nodes in the XmlNodeList .
Examples
The following example creates a XmlDocument object and uses the GetElementsByTagName method and the resulting XmlNodeList to display all the book titles.
#using using namespace System; using namespace System::IO; using namespace System::Xml; int main() < XmlDocument^ doc = gcnew XmlDocument; doc->Load( "2books.xml" ); // Get and display all the book titles. XmlElement^ root = doc->DocumentElement; XmlNodeList^ elemList = root->GetElementsByTagName( "title" ); for ( int i = 0; i < elemList->Count; i++ ) < Console::WriteLine( elemList[ i ]->InnerXml ); > >
using System; using System.IO; using System.Xml; public class Sample < public static void Main() < XmlDocument doc = new XmlDocument(); doc.Load("2books.xml"); // Get and display all the book titles. XmlElement root = doc.DocumentElement; XmlNodeList elemList = root.GetElementsByTagName("title"); for (int i=0; i < elemList.Count; i++) < Console.WriteLine(elemList[i].InnerXml); >> >
Imports System.IO Imports System.Xml public class Sample public shared sub Main() Dim doc as XmlDocument = new XmlDocument() doc.Load("2books.xml") ' Get and display all the book titles. Dim root as XmlElement = doc.DocumentElement Dim elemList as XmlNodeList = root.GetElementsByTagName("title") Dim i as integer for i=0 to elemList.Count-1 Console.WriteLine(elemList.ItemOf(i).InnerXml) next end sub end class
The example uses the file 2books.xml as input.
The Handmaid's Tale 19.95 Pride And Prejudice 24.95
Подсчёт количества строк в текстовом файле
Во многих редакторах при работе с текстовым документом вы можете видеть, сколько всего строк содержится в этом файле. Строки между собой разделяются символом перевода строки, который в каждой операционной системе (Windows, Unix, Mac) свой.
Давайте разберёмся, как быстро подсчитать количество строк в текстовом файле независимо от той ОС, в котором выполняется наш код. Более того, текстовый файл может быть сколь угодно большим, поэтому мы будем использовать буферизацию потока, чтобы не израсходовать всю доступную оперативную память.
Предположим, наш метод принимает на вход абсолютный путь до целевого файла, а возвращает количество строк в виде целочисленного типа long. Рассмотрим две реализации.
Вариант c LineNumberReader
public static long getLineCountByReader(String fileName) throws IOException <
try ( var lnr = new LineNumberReader( new BufferedReader( new FileReader(fileName)))) <
while (lnr.readLine() != null ) ;
return lnr.getLineNumber();
>
>
Сначала мы в конструкции try-with-resources последовательно создаём три Reader’a, оборачивая один в другой:
- FileReader – для работы с файлом.
- BufferedReader – для буферизации потока и ускорения обработки.
- LineNumberReader – собственно, для подсчёта количества строк.
Все перечисленные ридеры являются ресурсами и конструкция try-with-resources гарантирует нам, что после выхода из этого блока они все будут закрыты.
Затем в цикле вызываем у LineNumberReader метод readLine(). Поскольку никаких дополнительных действий нам делать не надо, то тело цикла будет пустым. После выхода из цикла метод getLineNumber() возвращает нам количество строк в файле.
На мой взгляд, это наиболее «читаемая» реализация, но ниже мы рассмотрим чуть более быструю версию. А пока можем вызвать наш метод:
public static void main(String[] args) throws IOException <
System.out.println( «Lines count: » + getLineCountByReader( «/home/user/very-large-file.txt» ));
>
Даже для текстового файла на десятки мегабайт подсчёт количества строк занимает меньше секунды.
Вариант c инкрементом
Наш метод можно немного ускорить, отказавшись от LineNumberReader. Вместо этого будем подсчитывать строки с помощью обычного инкремента.
public static long getLineCountByIncrement(String fileName) throws IOException <
var lines = 0L ;
try ( var reader = new BufferedReader( new FileReader(fileName))) <
while (reader.readLine() != null ) <
lines++;
>
return lines;
>
>
Здесь мы точно так же в блоке try создаём FileReader и BufferedReader, чтобы по окончании они были гарантированно закрыты. После этого в цикле на каждой итерации также вызываем метод readLine(). На этот раз тело цикла у нас не пустое, в нём мы увеличиваем переменную lines на 1. Такая реализация быстрее предыдущей примерно на 10%.
Простой способ подсчитать количество элементов XML в Java
В этом примере мы изучим простой способ подсчета количества элементов XML в программе Java .
Document Интерфейс представляет весь документ HTML или XML. Концептуально он является корнем дерева документа и обеспечивает основной доступ к данным документа. getElementsByTagName возвращает NodeList из всех Elements в порядке документа с заданным именем тега и содержатся в документе.
Как посчитать количество строк в xml
Читается огромный файл и хотелось бы хоть как-то сделать прогресс бар. Никак не узнать количество узлов или хоть какую-то инфу о размере файла, ходе выполнения?
а как читается то?
(1)+ можно, например, через ДокументDOM, там есть методы подсчета количества узлов
если файл делаешь сам, то в корневой элемент засунь количество объектов атрибутом. если не сам, то тогда только, если читаешь не через чтениеХМЛ, оно хорошо тем, что работает последовательно и по этому не жрет памяти, но узнать что-то «вперед» — нереально
(1) Просто ЧтениеXML
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
Пока ЧтениеXML.Прочитать() Цикл
(3) выгрузка КД, не хотелось бы её курочить
(0) чтением XML нельзя, как я понимаю. Оно читает от начала и до упора, количество там никак не прогнозируется.
(0) Прикинь размер файла относительно количества элементов, примерно высчитывай.
(0) Узнать длину файла. Попробовать опоеделить длину строки XML считанного узла. Сделать поправку на число байт в символе и ты получишь примерное положение в файле. Плюс минус разделители строк.
(0) Или одновременно с чтением записывай прочитанное куда-нибудь строками. Длина записанного будет прогрессом.
(0) Или открыть файл дважды. Читать как текст и параллельно — как xml. Хотя, не уверен, что чтениеxml такое позволит.
может так, грубо.
СтрЧислоВхождений(ТекстXML, «<" )
(11) Некошерно, надо весь файл в память считывать. Тогда уж можно и точно посчитать.
Похрен, буду выводить количество прочитанных узлов. Если каждый день делать эту загрузку, то примерное количество всех будет уже известно
В (2) правильный ответ, если, конечно, файл не гигантского размера.
(5) Все таки решил курочить?
Но если файл действительно огромный, то есть еще потоковое чтение данных. Там можно порциями выбирать куски файла (примерно как перебирать выборку запроса), и обрабатывать их. При выборе куска файла система возвращает его содержимое и размер. Размеры накапливаем в какой-то переменной, делим на общий размер файла, умножаем на 100 и таким образом получаем проuhtcc обработки а процентах.
200 метров — это огромный?
(23) Тут правильнее мерять не в метрах, а в количестве узлов. Если там 10 узлов по 20 метров каждый, то не много, а если 20000 узлов — то много.
(25) около 5млн узлов
(25) Это важно для предлагаемого вами чтения всего файла и построения в памяти структуры dom?
(26) Тогда чтобы прочитать это через DOM, надо будет сначала все загрузить в оперативку. Скорее всего заглохнет.
(28) Но это же только что был правильный вариант! Как же так, Юрий?
(27) Да, это важно. Вся эта структура не нужна в оперативке, тем более, что там 5 млн узлов. В этом случае логичнее пробовать потоковое чтение.
(29) Внимательно перечитываем (14), особенно последние 6 слов. Или с первого раза не дошло?
(31) Юрий, я вас не понимаю. То есть, согласно (25), если файл в 200 мегабайт, состоит из 10 узлов с двоичными данными, то он не огромный и ваше (14) применимо, а если в файле в 200 мегабайт 5 млн текстовых узлов, то он огромный и надо читать последние 6 слов?
сейчас прогресс бар с конечным состоянием практически никто не делает. делай просто крутящийся кружок и колво загруженых
(32) Да, все верно, учитывая, что по условию задачи надо посчитать количество узлов.
200м вроде не много должно занять в памяти. можно прочитать кол-во узлов. закрыть и далее читать стандартно
(35) Проблема как раз в количестве узлов. DOM при 5 миллионах скорее загнется с большой долей вероятности. Хотя ТС может это легко проверить за 15 минут на своем севаке.
(26) и кто будет смотреть на этот прогрессбар.
Сделай, как в типовых обменах данными реализовано, — там просто кружок, который вертится постоянно, символизируя, что все работает и ни чего не сломалось.
(37) С прогрессбаром можно посчитать примерное время окончания обработки файла, иногда это бывает полезно.
(38) ну, узнал ты, что это будет через час. Дальше что?
Кому это может пригодиться и зачем?
Такие штуки должны происходить сами где-то на сервере без пользователей. А серверу прогрессбары не нужны
Серверу и 1С в принципе не нужна.
Пользователю нужно оповещение по электропочте или смс о завершении работ )
«Что касается быстродействия. то на файле 10 000 записей полная обработка заняла 30 секунд и на файле в 100 мегабайт линейно увеличилась в 10 раз.»
«Этот метод немного проще чем простой перебор узлов в DOM документе, но быстродействие. При 10 000 записей 69 секунд , а для 100 000 обработка длилась более часа, так и не завершилась, после чего была снята принудительно.»
«Пятый метод схож с предыдущим, но глобальной фабрике XDTO подается на вход не только сам XML документ, но и его тип. Метод замечательный, как по простоте создания, так и по быстродействию – 3,1 секунды на 10 000 записях.»
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший