Функция FILTERXML (ФИЛЬТР.XML) LibreOffice Calc

Автор ost, 16 марта 2021, 18:22

0 Пользователи и 1 гость просматривают эту тему.

ost

Доброго.
Научите, пож., пользоваться сабжем.

Можно ли, используя сабж, получить следующие данные (Текст1, ИНН1 и тд.) из xml-файла (блоков <sender></sender>) может быть несколько.

  <sender>
    <name>Текст1</name>
    <inn>ИНН1</inn>
    <kpp>КПП1</kpp>
    <oktmo>ОКТМО</oktmo>
    <account>Счет1</account>
    <corrAccount>КоррСчет1</corrAccount>
    <bankName>НаименованиеБанка1</bankName>
    <bankBik>БИК1</bankBik>
    <summ>СуммаРуб</summ>
    <uin>УИН</uin>
  </sender>


Спасибо.

sokol92

Можно так (XML в ячейке A1) для первого узла Sender:

=FILTERXML(A1;"/sender[1]/inn")

Второй параметр функции указывается в синтаксисе XPATH.
Владимир.

ost

#2
Неизменно получаю ошибку #ЗНАЧ
в А1 значение "D:\SoftMy\XpathLO\VP\05\decreeRepor_1t.xml", формула "=ФИЛЬТР.XML(A1;"//sender/inn")".

sokol92

#3
См. вложение.
В A1 не имя файла, а текст XML из Вашего начального сообщения.
Владимир.

ost

Оттыж... =)). А я в первый параметр ссылку на xml-файл пихаю. =)) Мдя.

Ценность функции из сабжа, таким образом, стремится к нулю.

ost


sokol92

Цитата: ost от 16 марта 2021, 18:56стремится к нулю
Попробуем реанимировать. Замените путь к файлу в формуле в ячейке A1 на свой (см. вложение).
Владимир.

ost

#7
Комп повесился.
Видимо, файлик оказался великоват (~9 кб)

kompilainenn

Цитата: ost от 16 марта 2021, 19:23Комп повесился.
как именно?! Я имею ввиду, из-за чего?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

ost

Запустил файл из вложения в #6.
Получил ошибку: https://yadi.sk/i/xBTM--XQcbpboA
Проигнорировав ее, заменил путь к файлу на свой. Повесил комп.

sokol92

#10
Попробуем еще раз (см. вложение).
Владимир.

ost

Сегодня уже никак. Завтра отпишусь.

economist

Если XML большие - то м.б. стоит их парсить на Python, в стандартную библиотеку входят два очень высокоуровневых быстрых модуля для XML. Там можно делать примерно так:

import xml.dom.minidom
dom = xml.dom.minidom.parse('G:/balance.xml') # Баланс в формате сдачи в ИФНС
dom.normalize()
stroka = dom.getElementsByTagName(\"ОбА\")[0] # вернет Запасы, НДС, ДЗ, ФинВлож из Баланса


А в мелких XML - можно просто построчно макросом  перебрать XML и дернуть нужное поле.

Если XML обновляется "на месте" и в него нужно просто иногда заглядывать - можно подключиться к нему как к TXT-файлу в БД .odb на чтение и "отражать" его содержимое в Calc. Если таких файлов много (тысячи) - они превратятся в таблицы, брать данные из них тоже можно макросом, а от XML-тегов - избавляться уже внутри.  

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

#13
LO содержит достаточно полный (и эффективный) набор "родных" средств для работы с DOM-моделями, включая, естественно, указанный в #12 метод getElementsByTagName.

Парсинг XML-файла размером 100 MB занимает 2 секунды.
Владимир.

ost

Цитата: sokol92 от 16 марта 2021, 19:42Попробуем еще раз (см. вложение).

Попробовал. Ошибок при запуске нет. Calc  состоянии https://yadi.sk/i/ZnfoHf8bScro_g
Подождал, пока процесс soffice.bin откушает 7,5 гигов оперативки. Завершил процесс. Перезагрузил машину.