我有以下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"
。
答案 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