XQuery - удалить узлы, основываясь на том, что его подэлемент находится в списке «бан» - PullRequest
0 голосов
/ 19 января 2010

Я полный нуб с XQuery, но прежде чем начать углубляться в него, я хотел бы спросить совета некоторых экспертов о том, смотрю ли я в правильном направлении.

Проблема: огромнаяXML-файл, который содержит большое количество пользователей и их информацию о доступе (права доступа к паролю и т. д.). Пример ниже:

<user>
    <name>JC1234</name>
    <password>popstar</password>
    <accesslevel>0</accesslevel>
</user>
<user>
    <name>AHkl</name>
    <password>Rudy10!</password>
    <accesslevel>2</accesslevel>
</user>

У меня есть список имен пользователей (CSV-файл), которые мне нужно удалитьчто огромные XML-файлы.результатом должен быть новый xml-файл без этих удаленных пользователей ....

это возможно с XQuery?Любой совет для быстрого и грязного решения приветствуется!

1 Ответ

1 голос
/ 19 января 2010

В vanilla XQuery 1.0 нет стандартного способа загрузки CSV-файла, хотя большинство реализаций имеют функцию разбора текста или аналогичную. Если нет, то содержимое файла может быть передано как параметр.

Файл CSV можно проанализировать с помощью функции токенизации:

declare variable $names = tokenize(unparsed-text("banned.csv"), ",")

И фактический запрос довольно прост. Предполагая, что ваш документ является фрагментом, содержащим только список <user /> узлов, тогда запрос просто

doc("users.xml")/user[not(name=$names)]

Если, однако, файл XML содержит много других данных, то вам могут быть полезны шаблоны XSLT.

...