基于子节点值删除xml中的节点

基于子节点值删除xml中的节点,xml,bash,xmlstarlet,Xml,Bash,Xmlstarlet,我正在使用wordpress的xml转储文件,无论出于何种原因,wordpress已经将数据库中的每个用户导出为每篇文章的“作者”。为了使xml文件更易于使用,我想删除除一个之外的所有author节点 以下是我所拥有的一个例子: <rss version="2.0" xmlns:excerpt="http://wordpress.org/export/1.2/excerpt/" xmlns:content="http://purl.org/rss/1.0/modules/conte

我正在使用wordpress的xml转储文件,无论出于何种原因,wordpress已经将数据库中的每个用户导出为每篇文章的“作者”。为了使xml文件更易于使用,我想删除除一个之外的所有author节点

以下是我所拥有的一个例子:

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

仅仅从XML文件中提取一个片段并不足以提供完整的答案。我将此示例数据包装在根标记中:

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

...

我找到的解决方案如下:

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

很抱歉,我对xml的熟练程度仅足以在php中使用它。正确的数据根是:
我最终找到了我要查找的内容,这与您给出的示例非常相似:
xmlstarlet ed-d”/rss/channel/wp:author[wp:author_id!=“35289']”file.xml>file2.xml
很好的一个:它将保留我的答案没有包含的所有xml标记。我建议你回答自己的问题,然后接受它。这将引导未来的读者找到正确的解决方案。
<root xmlns:wp="some.url">
...
</root
$ 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>
xmlstarlet ed -d "//wp:author[wp:author_id != '35290']" file.xml > out.xml