簡體   English   中英

根據子節點值刪除xml中的節點

[英]Remove nodes in xml based on sub-node value

我正在使用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>

乘以幾千個條目

我想刪除除此節點外的所有節點:

<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>

嘗試在shell腳本中執行此操作,但是我真的不確定從哪里開始,因為我以前從未使用過xmlstarlet,因此希望能獲得任何幫助。

更新以反映我發現的數據根和解決方案:

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

我找到的解決方案如下:

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

僅從XML文件中摘錄並不能真正為我們提供完整的答案。 我將此示例數據包裝在根標簽中:

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

然后,您可以提供一個XPath表達式來查找您要查找的節點:所有包含“ wp:author_id”子項並具有特定值的“ wp:author”節點。

$ 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示例很有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM