2014-03-24 74 views
1

我有一个包含大约15,103个xml文件的文件夹。阅读并提取XML解析器?

在文件夹内的XML文件的一个例子是如下。

000010000.img.xml

的XML部分我想关注的一个片段。

<imgdir name="000010000.img"> 
    <imgdir name="info"> 
     <int name="version" value="10" /> 
     <int name="cloud" value="0" /> 
     <int name="town" value="0" /> 
     <float name="mobRate" value="1.0" /> 
     <string name="bgm" value="Bgm34/MapleLeaf" /> 
     <int name="returnMap" value="10000" /> 
     <string name="mapDesc" value="" /> 
     <int name="hideMinimap" value="0" /> 
     <int name="forcedReturn" value="999999999" /> 
     <int name="moveLimit" value="0" /> 
     <string name="mapMark" value="MushroomVillage" /> 
     <int name="swim" value="0" /> 
     <int name="fieldLimit" value="8260" /> 
     <int name="VRTop" value="-892" /> 
     <int name="VRLeft" value="-1064" /> 
     <int name="VRBottom" value="915" /> 
     <int name="VRRight" value="1334" /> 
     <int name="fly" value="0" /> 
     <int name="noMapCmd" value="0" /> 
     <string name="onFirstUserEnter" value="" /> 
     <string name="onUserEnter" value="go10000" /> 
     <int name="standAlone" value="0" /> 
     <int name="partyStandAlone" value="0" /> 
     <string name="fieldScript" value="" /> 
    </imgdir> 

    </imgdir> 
    <imgdir name="portal"> 
     <imgdir name="0"> 
     <string name="pn" value="sp" /> 
     <int name="pt" value="0" /> 
     <int name="x" value="-389" /> 
     <int name="y" value="183" /> 
     <int name="tm" value="999999999" /> 
     <string name="tn" value="" /> 
     </imgdir> 
     <imgdir name="1"> 
     <string name="pn" value="sp" /> 
     <int name="pt" value="0" /> 
     <int name="x" value="-416" /> 
     <int name="y" value="185" /> 
     <int name="tm" value="999999999" /> 
     <string name="tn" value="" /> 
     </imgdir> 
     <imgdir name="2"> 
     <string name="pn" value="sp" /> 
     <int name="pt" value="0" /> 
     <int name="x" value="-450" /> 
     <int name="y" value="183" /> 
     <int name="tm" value="999999999" /> 
     <string name="tn" value="" /> 
     </imgdir> 
     <imgdir name="3"> 
     <string name="pn" value="out00" /> 
     <int name="pt" value="2" /> 
     <int name="x" value="1080" /> 
     <int name="y" value="541" /> 
     <int name="tm" value="20000" /> 
     <string name="tn" value="in00" /> 
     <string name="script" value="" /> 
     <int name="hideTooltip" value="0" /> 
     <int name="onlyOnce" value="0" /> 
     <int name="delay" value="0" /> 
     </imgdir> 
    </imgdir> 

我不知道如何(之前从未做过的XML解析)的代码,这一点,我认为这是可能的蝙蝠做。

我需要自动进入每一个XML文件,提取所有的门户网站信息&图ID,并把它所有到一个文本文件中。

下面是如何我需要的文本的输出是一个示例(使用XML的片段上方作为参考)

[10000] // <int name="returnMap" value="10000" /> 
total=4 // total amount of portals (4 below) 
sp 0 -389 183 999999999 // <imgdir name="0"> 
sp 0 -416 185 999999999 // <imgdir name="1"> 
sp 0 -450 183 999999999 // <imgdir name="2"> 
out00 2 1080 541 20000 // <imgdir name="3"> 

我需要一个程序进入每个XML,提取信息并将其始终放在一个文本文件中。

所有的XML文件具有相同的结构和都非常遵循相同的风格和imgdir名的,但都含有不同量的门户。

+0

你需要证明你做一些努力,你尝试过什么该做,没有工作? – Rafael

+0

我只是不知道如何抓住“SP”和“out00”,并把它全部变成while循环(比如如何将我移动到下一个文件,也是在同一时间继续投入相同的文字)。 – user3457618

+2

为什么不写一个程序,而不是试图破解一个.bat文件?如果您坚持使用脚本,请使用PowerShell,它可以执行XML解析 –

回答

0

这种类型的问题很难解决,因为你的不是描述了解决它所需的步骤,你只是说“这是数据,这是想要的结果,解决它!”。这意味着,你传递给我们的任务,正确地分析数据,并产生正确的程序得到结果......

下面的批处理文件是解决这个问题的方法;我认为输出示例中的//之后的部分不是必需的。

@echo off 
setlocal EnableDelayedExpansion 

(for %%a in (*.xml) do call :processFile "%%a") > output.txt 
goto :EOF 


:processFile 
set "returnMap=" 
for /F "tokens=3,5 delims==> " %%a in ('findstr /C:"<int name=" /C:"<imgdir name=" /C:"<string name=" %1') do (
    if not defined returnMap (
     if %%a equ "returnMap" (
     echo [%%~b] 
     set returnMap=true 
     set "portal=" 
    ) 
    ) else (
     if not defined portal (
     if %%a equ "portal" set portal=true & set /A i=0, skip=1 
    ) else (
     if !skip! equ 1 (
      set /A skip-=1 
      set "line=" 
     ) else if %%a neq "tn" (
      set "line=!line! %%~b" 
     ) else (
      set /A i+=1, skip=1 
      set "line[!i!]=!line:~1!" 
      if %%b neq "" goto endPortals 
     ) 
    ) 
    ) 
) 
:endPortals 
echo total=%i% 
for /L %%i in (1,1,%i%) do echo !line[%%i]! 

输出:

[10000] 
total=4 
sp 0 -389 183 999999999 
sp 0 -416 185 999999999 
sp 0 -450 183 999999999 
out00 2 1080 541 20000 
+0

这是意想不到的;神圣的地狱,它在批处理脚本!我目前正在编写代码,并且在C#控制台中完成了一个程序,但我只会使用它! – user3457618

+0

这没有奏效。我把批处理文件夹中,并让它运行,这是什么是输出的例子:http://www.privatepaste.com/8e05badfa1 – user3457618

+0

我的回答输出创建处理你上面贴的XML部分。整个文件可能在发布之前有另外一个' Aacini