读取和提取XML解析器

本文关键字:XML 提取 读取 | 更新日期: 2023-09-27 17:52:45

我有一个包含大约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文件,提取所有门户信息&map 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名称,但都包含不同数量的门户。

读取和提取XML解析器

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

这类问题很难解决,因为你没有描述解决它所需的步骤,你只是说"这是数据,这是想要的结果,解决它!"。这意味着您将正确分析数据并生成正确程序以获得结果的任务交给我们……

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

@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