Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用bash脚本从XML节点提取字符串_Xml_Bash - Fatal编程技术网

使用bash脚本从XML节点提取字符串

使用bash脚本从XML节点提取字符串,xml,bash,Xml,Bash,我似乎找不到确切的方法。我有这个XML文件 <session> <translations> <translation> <inside>198.18.133.1</inside> <name>adfs.domain1.com</name> </translation> <translation> <inside>1

我似乎找不到确切的方法。我有这个XML文件

<session>
  <translations>
   <translation>
      <inside>198.18.133.1</inside>
      <name>adfs.domain1.com</name>
    </translation>
    <translation>
      <inside>198.18.135.60</inside>
      <name>hds.domain2.com</name>
    </translation>
   </translations>
 </session>
这将给我域名1.com

有时我可能会有更多或更少的翻译,但它们的顺序并不总是相同的。因此,如果内部节点匹配198.18.133.1,我需要一种方法来拉取名称,或者如果内部节点匹配198.18.135.60,则需要拉取名称,等等

希望这是有意义的


感谢您当前的XPath表达式,包括:

/会话/翻译/翻译/姓名/文本 …可轻松更改为:

/会话/翻译/翻译[inside=198.18.133.1]/name/text …以执行所需的过滤

使用XMLStarlet而不是XMLLint执行此操作可能更像:

xmlstarlet sel -t -m '/session/translations/translation[inside="198.18.133.1"]/name' -v . -n
如果将-C参数添加到sel子命令中,它将发出XSLT模板,并在后台对其进行计算,您可以在安装了xsltproc的任何地方运行该模板,包括没有XMLStarlet的系统:


您考虑过XSLT吗?您可以使用Java SE和Saxonica HE来实现这一点。@jeff6times7,不需要JVM——每个现代Linux发行版和MacOS都附带xsltproc。也许您需要比1.0更新的版本,但此查询不需要标准的现代版本。@CharlesDuffy您确定Jason使用的是linux吗?即使不是linux,它也是bash附带的,这就足够缩小了范围。如今xsltproc几乎无处不在——它广泛用于在构建时将文档编译为HTML。如果您有最近15年的UNIX系列系统和编译器/开发工具链,那么没有JVM比没有xsltproc更常见,XMLStarlet将命令行查询编译为XSLT—在相关的使用模式下,可以要求它输出一个XSLT模板,该模板将执行命令行上给出的相同操作。谢谢,我尝试更改XPath表达式,但它给了我这个错误。XPath错误:无效谓词/session/translations/translation[inside=198.18.133.1]/name/text^xmlXPathEval:evaluation失败/session/translations/translation[inside=198.18.133.1]/name/text:没有这样的节点^18之后是句点,如果这有帮助的话,请参见inside=198.18.133.1,不在内部=198.18.133.1,在错误中?你不想让外壳吃掉你的引号……这是我在回答中使用单引号的一个原因——所以里面的双引号会被保留下来。是的,就是这样!非常感谢您的快速回复!像冠军一样工作!
xmlstarlet sel -t -m '/session/translations/translation[inside="198.18.133.1"]/name' -v . -n