读取并解压缩XML解析器?

时间:2014-03-24 23:55:48

标签: c# xml batch-file

我有一个包含大约15,103个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解析),我认为可以在.bat中进行编码。

我需要自动进入每个XML文件,提取所有门户信息&amp;地图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名称,但都包含不同数量的门户。

2 个答案:

答案 0 :(得分:1)

你应该提高你的搜索能力,无论如何我做了一个快速搜索,我发现:http://msdn.microsoft.com/en-us/library/87274khy(v=vs.110).aspx将帮助你解析XML,这个:http://msdn.microsoft.com/en-us/library/2kzb96fk.aspx将帮助你迭代目录和文件。

答案 1 :(得分: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