[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 WHY 于 2023-12-17 23:02 编辑
  1. @if(0)==(0) echo off
  2. dir /b *.xml | cscript -nologo -e:jscript "%~f0" > result.csv
  3. pause & exit
  4. @end
  5. var fso = new ActiveXObject('Scripting.FileSystemObject');
  6. while(!WSH.StdIn.AtEndOfStream) {
  7.     var f = WSH.StdIn.ReadLine();
  8.     var s = fso.OpenTextfile(f, 1).ReadAll();
  9.     var m = s.match(/<item>(?:(?!<\/?item>)[\s\S])+<\/item>/g);
  10.     for(var i=0; i<m.length; i++) {
  11.         var m1 = m[i].match(/\bSoul Crystal\b.+\n(?:(?!\bid=).)+\bid="([^"]+)"/);
  12.         var m2 = m[i].match(/\bproduction\b(?:(?!\bid=).)+\bid="([^"]+)"/);
  13.         if(m1 && m2) WSH.Echo(m1[1] + ',' + m2[1]);
  14.     }
  15. }
复制代码
  1. @if(0)==(0) echo off
  2. dir /b *.xml | cscript -nologo -e:jscript "%~f0" > result.csv
  3. pause & exit
  4. @end
  5. var xml = new ActiveXObject('Microsoft.XMLDOM');
  6. var reg = /\bSoul Crystal\b/;
  7. while(!WSH.StdIn.AtEndOfStream) {
  8.     var f = WSH.StdIn.ReadLine();
  9.     getXmlData(f);
  10. }
  11. function getXmlData(fileName) {
  12.     xml.load(fileName);
  13.     var nodes = xml.selectNodes('//item');
  14.     for(var i=0; i<nodes.length; i++) {
  15.         var s2 = nodes[i].lastChild.getAttribute('id');
  16.         var childs = nodes[i].childNodes;
  17.         for(var j=0; j<childs.length; j++) {
  18.             if(childs[j].nodeName == '#comment' && reg.test(childs[j].text)) {
  19.                 var s1 = childs[j+1].getAttribute('id');
  20.                 WSH.Echo(s1 + ',' + s2);
  21.                 break;
  22.             }
  23.         }
  24.     }
  25. }
复制代码

TOP

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

第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

返回列表