Когда приходит канал, я хочу отфильтровать каждый XML-файл , удалив
узлы, которые отсутствуют в моем массиве
в xpath
Шаг1. Выбрать все узлы, которые не выделены данными выражениями XPath
Я предполагаю, что под "узлами" вы подразумеваете элементы.
Если это так, то это выражение XPath :
//*[count(. | yourExpr1 | yourExpr2 ... | yourExprN)
>
count(yourExpr1 | yourExpr2 ... | yourExprN)
]
выбирает все элементы в документе XML, которые не выбраны ни одним из ваших выражений N XPath yourExpr1
, yourExpr2
, ..., yourExprN
Если под "узлами" вы подразумеваете элементы, текстовые узлы, узлы инструкций обработки (PI), узлы комментариев и узлы атрибутов, используйте это выражение XPath для выбора всех узлов, не выбранных вашими выражениями N XPath:
(//node() | //*/@*)
[count(. | yourExpr1 | yourExpr2 ... | yourExprN)
>
count(yourExpr1 | yourExpr2 ... | yourExprN)
]
Шаг2. Удалите все узлы, выбранные в шаге 1.
Для каждого из узлов, выбранных в шаге 1 выше, используйте:
node.ParentNode.RemoveChild(node);
Объяснение
Оператор объединения XPath |
создает объединение двух наборов узлов. Поэтому выражение yourExpr1 | yourExpr2 ... | yourExprN
при применении к документу XML создает набор всех узлов, выбранных любым из N заданных выражений XPath.
Узел $n
не относится к набору узлов $ns
точно тогда, когда
...
count($n | $ns) > count($ns)