Как удалить узлы xml, которых нет в массиве строк xpath? - PullRequest
1 голос
/ 13 января 2012

У меня есть массив значений xpath и канал xml .

Когда поступает канал, я хочу отфильтровать каждый файл XML удалив узлы, которые отсутствуют в моем массиве xpath .

Я могу придумать очень грязный способ сделать это:

1) для каждого узлав xml я формирую его xpath

2) проверяем, находится ли он в массиве.

3) если нет, удалите.

Есть ли более чистый способ?

Ответы [ 2 ]

1 голос
/ 15 января 2012

Когда приходит канал, я хочу отфильтровать каждый 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);

Объяснение

  1. Оператор объединения XPath | создает объединение двух наборов узлов. Поэтому выражение yourExpr1 | yourExpr2 ... | yourExprN при применении к документу XML создает набор всех узлов, выбранных любым из N заданных выражений XPath.

  2. Узел $n не относится к набору узлов $ns точно тогда, когда ...

    count($n | $ns) > count($ns)

1 голос
/ 13 января 2012

Ваш подход обратный (и подвержен ошибкам, поскольку любой данный узел может быть выбран несколькими действительными выражениями XPath). Вы должны:

  • Сначала выполните итерацию массива выражений и каким-то образом отметьте узлы, которые выбирает каждый из них (например, просто установите некоторый флаг на каждом узле). Еще лучше: оцените объединение всех выражений и выделите все за один шаг.
  • Затем пройдите DOM и удалите все элементы, которые не были отмечены на первом шаге.
...