如何使用批处理脚本获取子字段的内容?

时间:2016-12-12 17:55:02

标签: xml batch-file extraction

我有以下xml:

<datafield tag="007G">
    <subfield code="c">GBV</subfield>
    <subfield code="0">688845614</subfield>
  </datafield>

我尝试提取<subfield code="0" 688845614

的内容

这是我的代码:

@echo off
for /F "tokens=2 delims=>/<" %%i in ('findstr "007G" curlread.txt') do echo %%i
pause

但作为输出我只得到<datafield tag="007G">

xml文档中可能有很多<datafield tag="007G">,我需要从每个文档中获取<subfield code="0"

1 个答案:

答案 0 :(得分:2)

将结构化标记语言解析为分层数据总是更好,而不是将其作为平面文本进行分析。

要仅从第一个<subfield code="0">节点返回数据,请按以下步骤替换findstr命令:

powershell "([xml](gc curlread.txt)).selectSingleNode('//subfield[@code=0]/text()').data"

如果您有多个<subfield code="0">个节点,并且您想要所有节点的数据,那么

powershell "([xml](gc curlread.txt)).selectNodes('//subfield[@code=0]/text()') | %%{ $_.data }"

获胜的XPath。您还可以通过修改XPath选择器,仅指定<subfield code="0"><datafield tag="007G">个子节点:

//datafield[@tag=\"007G\"]/subfield[@code=0]/text()

重要提示: XPath中的引号必须使用反斜杠转义。

修改:根据您在以下评论中粘贴的XML:

<datafield tag="007G">
    <subfield code="c">GBV</subfield>
    <subfield code="0">688845614</subfield>
</datafield>
<datafield tag="008G">
    <subfield code="c">GBV</subfield>
    <subfield code="0">68614</subfield>
</datafield>

...请注意,这不是完全有效的XML。有效的XML具有单个分层根。在解析数据之前,您必须使用根标记将其括起来。

以下是如何执行此操作的示例:

@echo off & setlocal

set "xml=curlread.xml"
rem // Note that quotation marks in the XPath must be backslash escaped
set "xpath=//datafield[@tag=\"007G\"]/subfield[@code=0]/text()"

for /f "delims=" %%I in (
    'powershell "([xml]('<r>{0}</r>' -f (gc %xml%))).selectNodes('%xpath%') | %%{$_.data}"'
) do (
    set "subfield=%%I"

    setlocal enabledelayedexpansion
    echo something useful with !subfield!
    endlocal
)
pause
goto :EOF