如何使用批处理脚本获取子字段的内容?
How can I get the content of the subfield with batch script?
我有以下 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"
。
将结构化标记语言解析为分层数据总是比解析为要抓取的平面文本更好。
要return仅来自第一个<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
我有以下 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"
。
将结构化标记语言解析为分层数据总是比解析为要抓取的平面文本更好。
要return仅来自第一个<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