Удалить узлы в XML на основе значения подузла - PullRequest
0 голосов
/ 21 февраля 2019

Я работаю с дампом wordpress xml, и по любой причине wordpress экспортирует каждого пользователя в нашей базе данных как «автора» каждого поста.Чтобы облегчить работу с xml-файлом, я хотел бы удалить все авторские узлы, кроме одного.

Вот пример того, что у меня есть:

    <rss version="2.0" xmlns:excerpt="http://wordpress.org/export/1.2/excerpt/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wp="http://wordpress.org/export/1.2/">
<wp:author>
    <wp:author_id>35622</wp:author_id>
    <wp:author_login>some_username_1</wp:author_login>
    <wp:author_email>email@address.com</wp:author_email>
    <wp:author_display_name><![CDATA[some_username_1]]></wp:author_display_name>
    <wp:author_first_name><![CDATA[]]></wp:author_first_name>
    <wp:author_last_name><![CDATA[]]></wp:author_last_name>
</wp:author>
<wp:author>
    <wp:author_id>35290</wp:author_id>
    <wp:author_login>my_unique_username</wp:author_login>
    <wp:author_email>email@address.com</wp:author_email>
    <wp:author_display_name><![CDATA[my_unique_username]]></wp:author_display_name>
    <wp:author_first_name><![CDATA[]]></wp:author_first_name>
    <wp:author_last_name><![CDATA[]]></wp:author_last_name>
</wp:author>
<wp:author>
    <wp:author_id>35289</wp:author_id>
    <wp:author_login>some_username_2</wp:author_login>
    <wp:author_email>email@address.com</wp:author_email>
    <wp:author_display_name><![CDATA[some_username_2]]></wp:author_display_name>
    <wp:author_first_name><![CDATA[]]></wp:author_first_name>
    <wp:author_last_name><![CDATA[]]></wp:author_last_name>
</wp:author>
<wp:author>
    <wp:author_id>33404</wp:author_id>
    <wp:author_login>some_username_3</wp:author_login>
    <wp:author_email>email@address.com</wp:author_email>
    <wp:author_display_name><![CDATA[some_username_3]]></wp:author_display_name>
    <wp:author_first_name><![CDATA[]]></wp:author_first_name>
    <wp:author_last_name><![CDATA[]]></wp:author_last_name>
</wp:author>

Timesеще несколько тысяч записей

Я хотел бы удалить все узлы, кроме этого:

<wp:author>
    <wp:author_id>35290</wp:author_id>
    <wp:author_login>my_unique_username</wp:author_login>
    <wp:author_email>email@address.com</wp:author_email>
    <wp:author_display_name><![CDATA[my_unique_username]]></wp:author_display_name>
    <wp:author_first_name><![CDATA[]]></wp:author_first_name>
    <wp:author_last_name><![CDATA[]]></wp:author_last_name>
</wp:author>

Попытка сделать это в сценарии оболочки, но я не совсем уверен, гденачать, так как я никогда раньше не использовал xmlstarlet, поэтому буду признателен за любую помощь.

Обновлено, чтобы отразить корень данных и найденное мной решение:

xmlstarlet ed -d "//wp:author[wp:author_id != '35290']" file.xml > out.xml

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Решение, которое я нашел, выглядит следующим образом:

xmlstarlet ed -d "//wp:author[wp:author_id != '35290']" file.xml > out.xml
0 голосов
/ 22 февраля 2019

Извлечение всего лишь фрагмента из файла XML на самом деле не дает нам достаточного количества, чтобы дать полный ответ.Я обернул этот пример данных в корневой тег:

<root xmlns:wp="some.url">
...
</root

Затем вы можете предоставить выражение XPath для поиска искомого узла: все узлы "wp: author", содержащие "wp: author_id""child с конкретным значением.

$ xmlstarlet sel -t -c '//wp:author[wp:author_id = "35289"]' file.xml
<wp:author xmlns:wp="some.url">
    <wp:author_id>35289</wp:author_id>
    <wp:author_login>some_username_2</wp:author_login>
    <wp:author_email>email@address.com</wp:author_email>
    <wp:author_display_name>some_username_2</wp:author_display_name>
    <wp:author_first_name></wp:author_first_name>
    <wp:author_last_name></wp:author_last_name>
</wp:author>

Я нашел эту страницу примеров XPath полезную

...