【问题标题】:BATCH Script to insert return character to XML file将返回字符插入 XML 文件的 BATCH 脚本
【发布时间】:2015-06-06 07:12:53
【问题描述】:

我需要使用批处理脚本从没有任何返回字符的 XML 文件中解析一些信息。我的策略是复制 XML 文件并插入正确的返回字符,然后解析出我需要的行。目标是在 '>

XML 文件示例:

<NOUNS><thing 1>hammer</thing 1><person>The Stig</person></NOUNS>

【问题讨论】:

  • 不!您只需要使用一些包含 XML 解析的脚本。无需担心返回字符。我强烈建议使用powershell
  • 不幸的是,powershell 不是一个选项。如果可以选择,我很乐意使用几乎任何其他脚本语言来做到这一点。
  • 好的 - 看看second solution here.。它指的是从批处理文件中调用xml.exe。无论如何,避免 DIY XML 解析 :)
  • xml.exe 是了解的好工具。但是,为了让我陷入困境的限制,我不能使用第三方应用程序。最初我认为用一个简单的批处理函数来解析这并不难。谢谢你的建议。
  • 为什么需要插入回车符? XML 解析器不在乎。

标签: xml batch-file xml-parsing


【解决方案1】:

以下解决方案消除了包含通配符 *? 的字段。如果字段中包含引号,它也可能会失败。

@echo off
setlocal EnableDelayedExpansion

set "part="
call :ProcessFile < file.xml > fileWithNL.xml
goto :EOF

:ProcessFile
   set "line="
   set /P "line="
   set "line=!part!!line!"
   if not defined line exit /B

   for %%a in ("!line:><=>" "<!") do (
      set "part=%%~a"
      if "!part:~-1!" equ ">" (
         echo !part!
         set "part="
      )
   )
goto ProcessFile

编辑添加了新的混合方法

下面的新解决方案是一个 Batch-JScript 混合脚本,它比以前的纯 Batch 解决方案更高效,并且没有它的限制。将代码复制到扩展名为 .bat 的文件中。

@set @a=0  /*
@cscript //nologo //E:Jscript "%~F0" < file.xml > fileWithNL.xml
@goto :EOF */

WScript.Stdout.Write(WScript.Stdin.ReadAll().replace(/></g,">\r\n<"));

【讨论】:

    【解决方案2】:

    .bat 扩展保存它。它接受一个参数 - xml 文件:

    0</* :
    @cscript /nologo /E:jscript "%~f0" %*
    @goto :EOF
    */0;
    
    var FSOObj = new ActiveXObject("Scripting.FileSystemObject");
    var ARGS = WScript.Arguments;
    if (ARGS.Length < 1 ) {
     WScript.Echo("No file passed");
     WScript.Quit(1);
    }
    var filename=ARGS.Item(0);
    
    var readStream=FSOObj.OpenTextFile(filename, 1);
    
    var content=readStream.ReadAll();
    readStream.Close();
    
    function replaceAll(find, replace, str) {
      return str.replace(new RegExp(find, 'g'), replace);
    }
    
    var newConten=replaceAll("><",">\r\n<",content);
    
    var writeStream=FSOObj.OpenTextFile(filename, 2);
    writeStream.WriteLine(newConten);
    writeStream.Close();
    

    【讨论】:

    • 不需要hello 标签;第一行可以只是0&lt;/* :。这样看起来更神秘! ;) 你应该用引号将文件名括起来:"%~f0"
    • @Aacini - 啊是的。我专注于 jscript 部分,而模式只是复制/粘贴。
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2013-06-03
    • 2023-03-04
    相关资源
    最近更新 更多