xmlstarlet选择具有特定属性值

时间:2015-07-01 21:34:35

标签: xml bash xpath attributes xmlstarlet

我是所有这一切的新手,如果答案非常明显,请原谅我!我有一个从NCBI下载的XML文档,我试图从每个条目中提取主机信息,看起来像这样(但更深层次嵌套):

<OrgName_mod>
    <OrgMod>
        <OrgMod_subtype value="strain">2</OrgMod_subtype>
        <OrgMod_subname>Mvs/Jiroft.IRN/14.15/1[B3]</OrgMod_subname>
    </OrgMod>
    <OrgMod>
        <OrgMod_subtype value="nat-host">21</OrgMod_subtype>
        <OrgMod_subname>Homo sapiens</OrgMod_subname>
    </OrgMod>
</OrgName_mod>

我使用以下方法取得了成功:

xml sel -t -v //OrgName_mod/OrgMod[2]/OrgMod_subname -n file.xml

但问题是OrgMod节点中有时会有更多或更少的信息,而主机总是处于第二个位置。因此,我尝试了几乎所有版本的尝试,特别是选择主机节点:

xml sel -t -m //OrgMod/OrgMod_subtype[@value=nat-host] -v ../OrgMod_subname -n file.xml

我想选择带有nat-host属性的OrgMod_subtype节点,然后打印带有种类名称的兄弟(?)OrgMod_subname节点。

任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:3)

尝试这种方式:

public Student(String name, int age) {
    this.name = name;
    this.age = age;
}

答案 1 :(得分:0)

从我所看到的,通过转到其父母来引用兄弟姐妹的唯一方法。例如,我测试时出现以下错误:

$ xmlstarlet sel -t -m "//OrgMod/[OrgMod_subtype/@value='nat-host']/OrgMod_subname/text()" file.xml
Invalid expression: //OrgMod/[OrgMod_subtype/@value='nat-host']/OrgMod_subname/text()
compilation error: element for-each
xsl:for-each : could not compile select expression '//OrgMod/[OrgMod_subtype/@value='nat-host']/OrgMod_subname/text()'

所以我通过 ../ 向下进行即兴创作,这项工作:

$ xmlstarlet sel -t -m "//OrgMod/OrgMod_subtype[@value='nat-host']" -v "../OrgMod_subname/text()" file.xml
Homo sapiens~
$

我的 xmlstarlet 版本是:

$ xmlstarlet --version
1.6.1
compiled against libxml2 2.9.1, linked with 20904
compiled against libxslt 1.1.28, linked with 10129
$