简体   繁体   English

使用批处理脚本将XML文件标签数据提取到文本文件(串联问题)

[英]Extract XML file tag data to a text file(s) using Batch script (concatenation issue)

I have an application that will only output XML and my destination application can only read plain text files. 我有一个仅输出XML的应用程序,而我的目标应用程序只能读取纯文本文件。 I have a requirement to split the <pending> and <results> tag data it into two files and concatenate the output to a single line. 我需要将<pending><results>标记数据拆分为两个文件,并将输出连接到一行。 I'm having trouble with that; 我遇到了麻烦; any help would be appreciated. 任何帮助,将不胜感激。 Yes I would like to keep it in batch script. 是的,我想将其保留在批处理脚本中。

Input XML File: 输入XML文件:

<?xml version="1.0" encoding="utf-8"?>
<game>
    <visible>true</visible>
    <pending>
        <item>W1: Player 5 versus Player 28 • </item>
        <item>W1: Player 12 versus Player 21 • </item>
        <item>W1: Player 2 versus Player 31 • </item>
    </pending>
    <results>
        <item>W1: Player 13 defeats Player 20 (21-8) • </item>
        <item>W1: Player 29 defeats Player 4 (15-21) • </item>
        <item>W1: Player 24 defeats Player 9 (7-21) • </item>
    </results>
    <time>636680475521951568</time>
</game>

Required output(include the trailing space): 所需的输出(包括尾随空格):

Pending.txt Pending.txt

W1: Player 5 versus Player 28 • W1: Player 12 versus Player 21 • W1: Player 2 versus Player 31 • 

Results.txt Results.txt

W1: Player 13 defeats Player 20 (21-8) • W1: Player 29 defeats Player 4 (15-21) • W1: Player 24 defeats Player 9 (7-21) • 

The script I have: 我拥有的脚本:

@echo OFF

for /f "delims=" %%i in ('findstr /i /c:"<item>" input.xml') do call :job "%%i"
goto :eof

:job

set line=%1

set line=%line:/=%
set line=%line:<=+%
set line=%line:>=+%
set line=%line:*+item+=%
set line=%line:+=&rem.%
echo.%line%>>output.txt

:eof

Output I'm getting(in a single file): 我得到的输出(在单个文件中):

W1: Player 5 versus Player 28 • 
W1: Player 12 versus Player 21 • 
W1: Player 2 versus Player 31 • 
W1: Player 13 defeats Player 20 (21-8) • 
W1: Player 29 defeats Player 4 (15-21) • 
W1: Player 24 defeats Player 9 (7-21) • 

I'm myself a novize in xml, but PowerShell makes it easy: 我本人是xml的新手,但是PowerShell使它变得容易:

## Q:\Test\2018\07\25\SO_51509117.ps1
[xml]$xml=Get-Content .\input.xml -encoding utf8
($xml.game.pending.item|ForEach-Object{$_} ) -join '' |Set-Content .\pending.txt -Encoding utf8
($xml.game.results.item|ForEach-Object{$_} ) -join '' |Set-Content .\results.txt -Encoding utf8

Sample output 样品输出

> gc .\pending.txt
W1: Player 5 versus Player 28 • W1: Player 12 versus Player 21 • W1: Player 2 versus Player 31 •

> gc .\results.txt
W1: Player 13 defeats Player 20 (21-8) • W1: Player 29 defeats Player 4 (15-21) • W1: Player 24 defeats Player 9 (7-21) •

If you really want to brute force this with a batch file, this may work for you. 如果您真的想用批处理文件强行执行此操作,那么这可能对您有用。

@echo off
set "results="
set "pending="    
FOR /F "tokens=1* delims=<> " %%G IN (input.xml) do (
    IF /I "%%G"=="/pending" set "pending="
    IF DEFINED PENDING (
        FOR /F "tokens=1 delims=<" %%I IN ("%%H") DO call set "pline=%%pline%%%%I
    )
    IF /I "%%G"=="pending" set "pending=0"

    IF /I "%%G"=="/results" set "results="
    IF DEFINED RESULTS (
        FOR /F "tokens=1 delims=<" %%I IN ("%%H") DO call set "rline=%%rline%%%%I
    )
    IF /I "%%G"=="results" set "results=0"
)
echo %pline%
echo %rline%
pause

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM