从文件名包含空格的文件中提取 xml 标记值

从文件名包含空格的文件中提取 xml 标记值

我有一个文件“EXXARS - 物理库存调整报告 US PDF_es_ES.xlf”

文件数据:

<header>
 <prop-group name="ora_reconstruction">
    <prop prop-type="TemplateCode">XXPO_PHYS_INV_ADJ_ES_AS</prop>
    <prop prop-type="extractorVersion">10.1.3.4.2_1.5</prop>
 </prop-group>

我需要提取 和 结果之间的值:我需要变量 XXPO_PHYS_INV_ADJ_ES_ES 中的该值。

我有 cocomand 不工作

filename='ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf'
sed -n 's:.*<prop prop-type="TemplateCode">\(.*\)</prop>.*:\1:p' filename > ${LOBCODE}
echo " --> ${LOBCODE}"

答案1

假设 XML 文件格式良好:

<?xml version="1.0"?>
<header>
  <prop-group name="ora_reconstruction">
    <prop prop-type="TemplateCode">XXPO_PHYS_INV_ADJ_ES_AS</prop>
    <prop prop-type="extractorVersion">10.1.3.4.2_1.5</prop>
  </prop-group>
</header>

使用XML小星:

xmlfile='ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf'
LOBCODE=$( xml sel -t -v '//prop[@prop-type="TemplateCode"]' "$xmlfile" )

这使用 XMLStarlet 提取属性prop为 的节点的值。该变量将通过上述 XML获取值。prop-typeTemplateCodeLOBCODEXXPO_PHYS_INV_ADJ_ES_AS

XMLStarlet 有时可能安装为xmlstarlet而不是安装为xml


您的代码有两个问题:

  1. 您将命令的输出重定向sed到名称由 指定的文件$LOBCODE。如果$LOBCODE为空,则此重定向将失败。我假设您想要做的是将 的输出分配sed给变量LOBCODE。这是通过命令替换完成的,如我上面所示。请注意,对于解析 XML 数据来说,这sed是一个糟糕的选择。

  2. 您指示sed使用一个名为filename.从事sed以下工作变量的值 filename您需要$在变量名称前面使用。另外,由于文件名中有空格,因此您需要双引号变量扩展(您应该总是无论如何,都要这样做)。因此你应该使用"$filename"(我在上面的代码中使用了更具描述性的变量名称)。

答案2

@Kusalananda 的答案非常好,但如果你有的xmllint话,你可以使用这个:

filename='ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf'
LOBCODE=$(xmllint --xpath "header/prop-group[@name='ora_reconstruction']/prop[@prop-type='TemplateCode']/text()" "$filename")

笔记:

  • 我使用了完整路径规范,以防您只需要prop-group“ora-reconstruction”属性。 @Kusalananda 的方法假设您想要任何prop具有“TemplateCode”属性的元素:哪种方法更可取取决于您的数据。
  • text()仅返回元素内的文本prop(否则xmllint也返回周围的元素。)

重要部分的示例运行:

$ xmllint --xpath "header/prop-group[@name='ora_reconstruction']/prop[@proptype='TemplateCode']/text()" "ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf"
XXPO_PHYS_INV_ADJ_ES_AS

答案3

$ cat test.xml
<header>
 <prop-group name="ora_reconstruction">
    <prop prop-type="TemplateCode">XXPO_PHYS_INV_ADJ_ES_AS</prop>
    <prop prop-type="extractorVersion">10.1.3.4.2_1.5</prop>
 </prop-group>

$ awk -F"[<>]" '/TemplateCode/{print $3;exit}' test.xml
XXPO_PHYS_INV_ADJ_ES_AS

相关内容