Отфильтровать пустые элементы из массива - XPATH - PullRequest
1 голос
/ 04 февраля 2020

Контекст:

Я пытаюсь Filter Empty значений из массива. Я знаю, что мы можем l oop массив до Redim Preserve, но подумал, что может быть способ включить функцию Filter. Однако, поскольку Filter рассматривает все элементы в Array как String типы данных, не существует такой вещи, как arr = Filter(arr, Empty, False), которую я пробовал во многих формах.

Это привело меня к WorksheetFuntion.FilterXML однако, у меня мало опыта в XPATH, и я явно делаю что-то не так, упуская концепцию элементов и узлов. Я знаю, что Excel работает на XPATH 1.0, и поэтому я искал способ «отфильтровать» пустые элементы и натолкнулся на [not (node ​​())] . Однако реализация этого вернула Error 1004 при получении arr1


Образец:

Sub Test()

Dim arr0 As Variant, arr1 As Variant, arr2 As Variant

arr0 = Array("A", "A", Empty, "A")
arr1 = WorksheetFunction.FilterXML("<t><s>" & Join(arr0, "</s><s>") & "</s></t>", "//s[not(node())]")
arr2 = WorksheetFunction.FilterXML("<t><s>" & Join(arr0, "</s><s>") & "</s></t>", "//s[string-length(text()) > 0]")

End Sub

Вопрос:

Чтобы обойти эту проблему, мой второй вариант заключался в проверке длины строк, которая в этом случае сделала работать и возвращать массив без пустых элементов.

Может кто-нибудь объяснить мне, как улучшить синтаксис [not(node())], чтобы он работал. Некоторое объяснение , почему текущий код не работает, также будет высоко оценено.

1 Ответ

1 голос
/ 13 февраля 2020

Улучшение [Not(node())] синтаксиса

Просто используйте //s[not(.='')], т.е.

arr1 = WorksheetFunction.FilterXML("<t><s>" & Join(arr0, "</s><s>") & "</s></t>", "//s[not(.='')]")

, где . относится к самому содержимому узла, по сравнению с пустая строка и отрицание :-)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...