从搜索结果中获取XML整个元素

从搜索结果中获取XML整个元素,xml,perl,search,grep,Xml,Perl,Search,Grep,我有一堆XML文件,每个文件的格式 <?xml version="1.0" encoding="UTF-8"?> <A> <R> <B></B> <Q></Q> <U></U> </R> ... </A> ... 我需要在每个字符串中搜索字符串,并返回整个元素“R”。问题是有带字符串的新行

我有一堆XML文件,每个文件的格式

<?xml version="1.0" encoding="UTF-8"?>
<A>
    <R>
        <B></B>
        <Q></Q>
        <U></U>
    </R>
    ...
</A>

...
我需要在每个字符串中搜索字符串,并返回整个元素“R”。问题是有带字符串的新行,所以我不能使用grep-bn-ann,因为每个搜索结果前后的行数可能不同

例如,给定以下内容

<?xml version="1.0" encoding="UTF-8"?>
<A>
    <R>
        <B>abc</B>
        <Q>0123</Q>
        <U>xyz</U>
    </R>
    <R>
        <B>
            qwe
            rty
            yui
        </B>
        <Q>0123</Q>
        <U>
            zxc
            abc
        </U>
    </R>
    <R>
        <B>lkj</B>
        <Q>
            lkjhgfdsa
            wer
        </Q>
        <U>
            poixyz
            zaq
        </U>
    </R>
</A>

abc
0123
xyz
qwe
蒂
尤伊
0123
zxc
abc
列车运行监控装置
lkjhgfdsa
wer
波西兹
扎克
如果我对“xyz”进行grep,那么我需要

<R>
    <B>abc</B>
    <Q>0123</Q>
    <U>xyz</U>
</R>
<R>
    <B>lkj</B>
    <Q>
        lkjhgfdsa
        wer
    </Q>
    <U>
        poixyz
        zaq
    </U>
</R>

abc
0123
xyz
列车运行监控装置
lkjhgfdsa
wer
波西兹
扎克

我不反对使用其他工具,如perl、egrep等。。。要做到这一点。非常感谢您提供的任何帮助。

是的,可以用Perl完成,例如使用以下附带的
xpath
可执行文件:

或者使用另一种选择,例如我的(此网站不允许我链接到它),它基于:

另一个选择是:

附言:这些只是daxim答案的替代品。 我不知道xml_grep2,我会马上安装它! 要点是在这里使用XPath是个好主意。

学习和使用

$xml\u grep2-x'/*[text()[contains(string(.),“xyz”)]]/祖先::R'nvanwyen.xml
abc
0123
xyz
列车运行监控装置
lkjhgfdsa
wer
波西兹
扎克

这两种解决方案都无法正常工作。两者似乎都不会产生任何结果。。。一定是我。
xpath a.xml '//R[.//*[contains(text(),"xyz")]]'
xpath-rp -e '//R[.//*[contains(text(),"xyz")]]' a.xml
xmlstarlet sel -t -c '//R[.//*[contains(text(),"xyz")]]' a.xml
$ xml_grep2 -x '//*[text()[contains(string(.),"xyz")]]/ancestor::R' nvanwyen.xml

<R>
        <B>abc</B>
        <Q>0123</Q>
        <U>xyz</U>
    </R>
<R>
        <B>lkj</B>
        <Q>
            lkjhgfdsa
            wer
        </Q>
        <U>
            poixyz
            zaq
        </U>
    </R>