【问题标题】:DOS Batch extracting block from xml fileDOS从xml文件中批量提取块
【发布时间】:2013-10-16 12:47:28
【问题描述】:

我找不到这样做的方法(已尝试通过 StackOverflow 搜索)。

我有一个格式化的 xml 文件,我必须按原样从中提取一个块(不修改格式、制表符、 等。)例如,假设有一个文件叫some.xml

块由以下分隔:

 <!- Let us call this tag_begin -->
 <Ask Ref_Ask="XXXYYYYY">   
   ...
 <!- Let us call this tag_end -->
 </Ask>  

我成功提取了 blockend 标记的开始行和结束行,但我无法将所有行长度放入 result.txt 文件中:行停止在 127 个字符长度处:怎么了?

@echo off

Set Tag_Begin="<Ask Ref_Ask="
Set Tag_End="</Ask>"
set NB=XXXYYYY
set /A CPTE=0
set Line_Begin=
set Line_End=


Rem --- Find all possible start of block lines, and extract the good one set to Line_Begin
findstr /n /C:%Tag_Begin% some.xml | find /i "%NB%"> temporary.txt
for /f "tokens=1 delims=:" %%L in (temporary.txt) do set Line_Begin=%%L

Rem --- Finding the line order (from all possible start lines) which match the good one
findstr /n /C:%Tag_Begin% some.xml | findstr /n "%NB%"> temporary.txt
for /f "tokens=1 delims=:" %%O in (temporary.txt) do set order_begin=%%O
set /A order_begin-=1


Rem -- Looking for all possible end of block lines, and extract the "order_begin" one for Line_End
for /f "skip=%order_begin% tokens=1 delims=:" %%F in ('findstr /n /C:%Tag_End% some.xml') do set Line_End=%%F & goto away
:away


setlocal enabledelayedexpansion
for /f %%L in (some.xml) do (
set /A CPTE+=1
echo CPTE=!CPTE!
if !CPTE! GEQ %Line_Begin% if !CPTE! LEQ %Line_End% echo %%L >> result.txt
)
setlocal disabledelayedexpansion

del temporary.txt

【问题讨论】:

  • @JohnSaunders - 有一批会更酷:)

标签: xml batch-file


【解决方案1】:

未测试:

        @echo off
        for /f "tokens=1 delims=:" %%L in ('findstr /n "<!- Let us call this begin tag -->" ssome.xml') do ( 
         set begin_line=%%L
        )

        for /f "tokens=1 delims=:" %%L in ('findstr /n "<!- Let us call this end tag -->" some.xml') do ( 
         set /a end_line=%%L+1
        )

        echo showing lines between %end_line% and %begin_line%
        break>"%temp%\empty"
        fc "%temp%\empty" "some.xml" /lb  %end_line% /t |more +4 | findstr /B /E /V "*****" | more +%begin_line%
        del /Q /F "%temp%\empty"

用你的文件更改三个地方的some.xml

【讨论】:

  • 谢谢:我会尝试/更新它以满足我的需要并尽快通知您
  • 3 部分:1) 找到开始行 2) 找到结束行然后 3) 提取 1 和 2,第一个 pb 是 some.xml 包含许多此类块:很多开始标签:每个“ Ref_Ask=" 具有由 " " 大量结束标记引用的唯一引用:因此 3) 的结束标记与开始标记一样多,我进行更改以提取:我设置自己的 begin_line 和 end_line 使用更多 +8 而不是 more+4将 7 添加到 3) 的真实 end_line,我也有一个 pb,因为该行被“剪切”:not line is longer than 127 chars 在询问之前,我已经尝试使用 setlocal 关于由 xml 格式引起的“”问题
  • 我已经编辑了答案,现在它更精确了。测试它并且工作正常。您不需要添加setlocal,因为 在引号内。但只会显示最后一段...
【解决方案2】:

这使用了一个名为 findrepl.bat 的辅助批处理文件,来自 - http://www.dostips.com/forum/viewtopic.php?f=3&t=4697

findrepl.bat 与批处理文件放在同一文件夹中。

@echo off
type some.xml|findrepl "<Ask Ref_Ask=.XXXYYYYY.>" /e:"</Ask>" >newfile.xml

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多