如何使用批处理脚本从 xml 文件中获取参数

问题描述 投票:0回答:2

专家,

我有如下的 test_123.xml 文件。我需要提取几行并将其移动到 result.txt 文件。我的代码中似乎存在一些问题。请帮助修复此代码以提取所需的信息。

<?xml version="1.0" encoding="ascii" ?>
<RunTimeModule Type="FlowManager">
  <Id>3</Id>
  <Name>test_123</Name>
  <StandAlone>Y</StandAlone>
  <Log>
    <Mode>DEBUG</Mode>
    <Path>/test01/log</Path>
    <Retention>7</Retention>
  </Log>
  <UXCodes>
    <System>UXtest510</System>
    <User>UXtest510</User> 
  </UXCodes>
  <Alert>
        <Frequency>15</Frequency>
  </Alert>
  <FlowManager>
        <LoopingFrequency>120</LoopingFrequency>
        <ProcessAndTerminate>N</ProcessAndTerminate>
        <CleanUpMemoryAfterProcess>Y</CleanUpMemoryAfterProcess>
        <CleanUpMemoryThreshholdInMB>5</CleanUpMemoryThreshholdInMB>
        <RetryAttempts>Infinite</RetryAttempts>
        <Node Id="1" Name="SourceFtp">
            <Adapter Type="Source" TypeName="Ftp" Module="ftp.dll"/>
            <InputParameters>
                <Parameter Name="FilePath" Value="/test_dev/TestSend/"/>
                <Parameter Name="FileName" Value="*.txt"/>
                <Parameter Name="MarkData">
                    <SubParameter Name="RenameFile" Value="Y"/>
                </Parameter>
                <Parameter Name="LogonAttempts" Value="10"/>
                <Parameter Name="FtpProperties">
                        <SubParameter Name="HostIP" Value="192.168.10.5"/>
                        <SubParameter Name="HostName" Value="test01"/>
                        <SubParameter Name="UserId" Value="test01"/>
                        <SubParameter Name="Password" Value="_SSC_PASSWORD_AT_LOGIN"/>
                        <SubParameter Name="Port" Value="21"/>
                        <SubParameter Name="TransferMode" Value="ASCII"/>
                        <SubParameter Name="CheckFileSize" Value="N"/>
                        <SubParameter Name="ConnectionTimeOut" Value="540"/>
                </Parameter>
            </InputParameters>
        </Node>
        <Node Id="2" Name="DestinationPriceQ">
            <Adapter Type="Destination" TypeName="MQ" Module="asmq.dll"/>
            <InputParameters>
                <Parameter Name="QueueManager" Value="QT0012"/>
                <Parameter Name="Queue" Value="EPH.TEST.IN.OUT"/>
                <Parameter Name="UseCCDT" Value="Y"/>
                <Parameter Name="PutMessageOptions">
                    <SubParameter Name="Group:EnableMessageGrouping" Value="N"/>
                </Parameter>
                                <Parameter Name="MQMD">
                                     <SubParameter Name="Segmentation" Value="N"/>
                                     <SubParameter Name="LogicalOrder" Value="N"/>
                                    <SubParameter Name="Format" Value="MQSTR"/>
                                </Parameter>
                <Parameter Name="$Data$" Map="Source.Ftp.1.$Data$"/>
            </InputParameters>
        </Node>
  </FlowManager>
</RunTimeModule>

我需要提取以下5个参数:

<HostIP> <UserId> <FilePath> <FileName> <QueueManager>

这里是为从 xml 文件中提取 5 个参数而编写的代码。但是我没有从下面的批处理脚本中得到所需的输出

@echo off
setlocal EnableDelayedExpansion

(for /F "delims=" %%a in ('findstr /I /L "<HostIP> <UserId> <FilePath> <FileName> <QueueManager>" H:\test_123.xml') do (
   set "line=%%a"
   set "line=!line:*<HostIP>=!"
   set "line=!line:*<UserId>=!"
   set "line=!line:*<FilePath>=!"
   set "line=!line:*<FileName>=!"
   set "line=!line:*<QueueManager>=!"
   
   for /F "delims=<" %%b in ("!line!") do echo %%b
 )
) > result.txt

result.txt 文件没有附加任何数据。

这是 Node Id="1" 的预期输出。


<SubParameter Name="HostIP" Value="192.168.10.5" />
<SubParameter Name="UserId" Value="test01" />
<Parameter Name="FilePath" Value="/test_dev/TestSend"/>
<Parameter Name="FileName" Value="*.txt" />

这是 Node Id="2" 的预期输出

<Parameter Name="QueueManager" Value="QT0012"/>
xml windows batch-file
2个回答
1
投票

如果我们接受你想要的子字符串的唯一实例出现一次,下面的批处理文件能帮助你吗?

@(For /F "Delims=>" %%G In ('%SystemRoot%\System32\findstr.exe
 /RI "\"FilePath\" \"FileName\" \"HostIP\" \"UserId\" \"QueueManager\""
 "H:\test_123.xml" 2^>NUL'
) Do @For /F "Tokens=*" %%H In ("%%G>") Do @Echo %%H) 1>"result.txt"

你甚至可以把它放在一行中:

@(For /F "Delims=>" %%G In ('%SystemRoot%\System32\findstr.exe /RI "\"FilePath\" \"FileName\" \"HostIP\" \"UserId\" \"QueueManager\"" "H:\test_123.xml" 2^>NUL') Do @For /F "Tokens=*" %%H In ("%%G>") Do @Echo %%H) 1>"result.txt"

甚至从命令提示符窗口运行它:

(For /F "Delims=>" %G In ('%SystemRoot%\System32\findstr.exe /RI "\"FilePath\" \"FileName\" \"HostIP\" \"UserId\" \"QueueManager\"" "H:\test_123.xml" 2^>NUL') Do @For /F "Tokens=*" %H In ("%G>") Do @Echo %H) 1>"result.txt"

根据您提交的 XML 文件内容,

result.txt
在当前目录中的预期输出为:

<Parameter Name="FilePath" Value="/test_dev/TestSend/"/>
<Parameter Name="FileName" Value="*.txt"/>
<SubParameter Name="HostIP" Value="192.168.10.5"/>
<SubParameter Name="UserId" Value="test01"/>
<Parameter Name="QueueManager" Value="QT0012"/>

0
投票

试试这个:

@echo off
setlocal enabledelayedexpansion

set input_file=Test_123.xml
set output_file=result.txt

set node_id_1=false
set node_id_2=false

(for /f "tokens=*" %%a in ('type "%input_file%"') do (
  set line=%%a

  rem Check for Node Id="1"
  echo !line! | findstr /c:"<Node Id=\"1\"" >nul
  if !errorlevel! equ 0 set node_id_1=true

  rem Check for Node Id="2"
  echo !line! | findstr /c:"<Node Id=\"2\"" >nul
  if !errorlevel! equ 0 set node_id_2=true

  rem Extract lines for Node Id="1"
  if !node_id_1! (
    echo !line! | findstr /c:"<SubParameter Name=\"HostIP\"" >nul
    if !errorlevel! equ 0 echo !line! >> %output_file%

    echo !line! | findstr /c:"<SubParameter Name=\"UserId\"" >nul
    if !errorlevel! equ 0 echo !line! >> %output_file%

    echo !line! | findstr /c:"<Parameter Name=\"FilePath\"" >nul
    if !errorlevel! equ 0 echo !line! >> %output_file%

    echo !line! | findstr /c:"<Parameter Name=\"FileName\"" >nul
    if !errorlevel! equ 0 echo !line! >> %output_file%
  )

  rem Extract lines for Node Id="2"
  if !node_id_2! (
    echo !line! | findstr /c:"<Parameter Name=\"QueueManager\"" >nul
    if !errorlevel! equ 0 echo !line! >> %output_file%
  )

  rem Reset node flags after each node block
  echo !line! | findstr /c:"</Node>" >nul
  if !errorlevel! equ 0 set node_id_1=false & set node_id_2=false
)) >nul
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.