我是所有这一切的新手,如果答案非常明显,请原谅我!我有一个从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节点。
任何帮助都会非常感激!
答案 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
$