[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
Test.ps1
  1. $out = [Collections.ArrayList]@();
  2. $comments = Select-XML *.xml -XPath '//item/comment()[contains(string(),"Soul Crystal")]'; #item节点中包含关键字的注释节点
  3. forEach ($comment In $comments) {
  4.     $s1 = $comment.Node.NextSibling.NextSibling.id;
  5.     $s2 = $comment.Node.ParentNode.production.id;
  6.     if ($s1 -ne $null -and $s2 -ne $null) {
  7.         [void]$out.Add($s1 + ',' + $s2);
  8.     }
  9. }
  10. sc 1.csv -Value $out;
复制代码

TOP

本帖最后由 qixiaobin0715 于 2023-12-21 10:36 编辑

第一个for循环主要是排除不含Soul Crystal的xml文件。
变量延迟加在合适的位置即可:
  1. @echo off
  2. (for /f "delims=" %%i in ('findstr /m /c:"Soul Crystal" *.xml') do (
  3.     for /f "tokens=1,3,4" %%a in ('type "%%i"') do (
  4.         if "%%a"=="<item>" (
  5.             set x=true
  6.         ) else if "%%a"=="</item>" (
  7.             set x=
  8.             setlocal enabledelayedexpansion
  9.             for /f "tokens=2 delims==" %%d in ("!str1!") do echo,!str2!,%%~d
  10.             endlocal
  11.         ) else if defined x (
  12.             if "%%b%%c"=="SoulCrystal" (
  13.                 set y=true
  14.             ) else if defined y (
  15.                 set y=
  16.                 for /f "tokens=2 delims==" %%d in ("%%b") do set str2=%%~d
  17.             )
  18.             set str1=%%b
  19.         )
  20.     )
  21. ))>out.csv
  22. pause
复制代码
1

评分人数

    • 77七: 感谢分享,findstr用法学习了!技术 + 1

TOP

受10楼代码启示,这样应当在逻辑上更容易理解些:
1.找出"Soul Crystal"和"</item>"所在的行数;
2.根据第1条找出数据所在行的行数,并随后对这些行进行处理,得到所需ID数值。
  1. @echo off
  2. (for /f "delims=" %%i in ('findstr /m /c:"Soul Crystal" *.xml') do (
  3.     setlocal enabledelayedexpansion
  4.     for /f "tokens=1,2 delims=: " %%j in ('findstr /ilnc:"Soul Crystal" /inc:"</item>" "%%i"') do (
  5.         set n=%%j
  6.         if "%%k"=="</item>" (
  7.             set /a n-=1
  8.             set _!n!=true
  9.         ) else (
  10.             set /a n+=1
  11.             set #!n!=true
  12.         )
  13.     )
  14.     for /f "tokens=1,4 delims=: " %%a in ('findstr /n .* "%%i"') do (
  15.         if defined #%%a (
  16.             for /f "tokens=2 delims==" %%c in ("%%b") do set "str=%%~c"
  17.         ) else if defined _%%a (
  18.             for /f "tokens=2 delims==" %%c in ("%%b") do echo,!str!,%%~c
  19.         )
  20.     )
  21.     endlocal
  22. ))>out.csv
  23. pause
复制代码

TOP

回复 1# zhengwei007

啊哦,来晚了,该分享文件已过期
我是小白,希望老师多多帮助

TOP

第3方 xmlStarLet 下载:http://bcn.bathome.net/tool/xml.exe
找到包含 Soul Crystal 的注释节点后面的下一个节点XPath1以及最后一个节点XPath2,放到 for 循环中处理。
  1. @echo off
  2. set "XPath1=//item/comment()[contains(string(),'Soul Crystal')]/following-sibling::*[1]"
  3. set "XPath2=//item/comment()[contains(string(),'Soul Crystal')]/following-sibling::*[last()]"
  4. setlocal enabledelayedexpansion
  5. (for %%i in (*.xml) do (
  6.     for /f %%j in ('xml sel -t -m "%XPath1%|%XPath2%" -n -v "@id" "%%i"') do (
  7.         if defined s (
  8.             echo;!s!,%%j
  9.             set "s="
  10.         ) else (
  11.             set "s=%%j"
  12.         )
  13.     )
  14. )) > 0.csv
  15. pause
复制代码
sed下载:http://bcn.bathome.net/tool/4.8/sed.exe
原理大概是:
先定位 <item> 与 </item> 区间,再定位 Soul Crystal 与 production 区间,
找到关键字Soul Crystal,把下一行hold住;找到production的行,hold追加到模式空间,再回显。
  1. sed -r -n "/<item>/,/<\/item>/{/Soul Crystal/,/production/{/Soul Crystal/{n;h};/production/{G;s/^.*id=\"([0-9]+)\".*\n.*id=\"([0-9]+)\".*$/\2,\1/;p}}}" *.xml > 1.csv
复制代码

TOP

返回列表