2013-10-02 295 views
0

我必须从一个xml文件中读取一个特定标记,该文件包含整行内容。 比如我employee.xml文件看起来如下图所示从bat文件中包含单行文件的文件中读取xml标记

<EMP><FNAME>ss</FNAME><LNAME>rr</LNAME><ID>11</ID></EMP> 

我想读LNAME的.bat文件的值。

我能读取文件,如果所有的标签来自一个单独的行,但如果他们在一行中,那么我的代码失败。

任何人都可以请帮忙解决这个问题吗?也有可能在同一个批处理文件中处理这两种情况?

回答

1

这将使用名为repl蝙蝠从助手批处理文件 - http://www.dostips.com/forum/viewtopic.php?f=3&t=3855

repl.bat在同一文件夹中的批处理文件。

@echo off 
for /f "delims=" %%a in ('type employee.xml ^|repl ".*<LNAME>(.*)</LNAME>.*" "$1" a ') do echo "%%a" 
pause 
+0

没有使用repl.bat的简单方法 – user2593173

+0

简单吗?也许。简单而可靠的数据可以改变?也许,但通常不会。这一切都取决于确切的文字数据以及它如何改变。批处理文件在很多情况下依赖于数据的组成。您可以使用SED等第三方工具,这将是一个简单的命令。 – foxidrive

+0

xml文件将具有相同的结构,并且将始终查找特定字段(本例中为LNAME)。 – user2593173

1
@ECHO OFF 
SETLOCAL 
FOR /f "delims=" %%i IN (q19138159.txt) DO SET line=%%i 
:loop 
FOR /f "tokens=1*delims=<>" %%i IN ("%line%") DO SET line=%%j&IF /i NOT "%%i"=="lname" GOTO loop 
FOR /f "tokens=1delims=<>" %%i IN ("%line%") DO SET line=%%i 
ECHO lname=%line%= 
GOTO :EOF 

其中q19138159.txt是包含您的XML行的文件。


对于大文件 - 与支持SED

@ECHO OFF 
SETLOCAL 
FOR /f "delims=" %%i IN (
'sed s#.*\x3cLName\x3e\(.*\^)\x3c/LName\x3e.*#\1# q19138159.txt' 
) DO ECHO %%i 

GOTO :eof 

GNUSED将处理包含<LName>something or other</LName>提取something or other文件。

的处理命令是

 
s substitute 
# a delimiter 
.* Any number of any characters 
\x3c 
\(sed instruction : save... 
.* any number of any characters 
\^) End of thing-to-be-saved; `)` escaped by `^` to not-close the `IN` 
\x3c 
.* any number of any characters 
# delimiter between substitute-for-string and substitute-with string 
\1 retrieve thing #1 saved 
# end of substitute-with string 

谷歌为GNUSED

+0

这是有效的和动态的。 – foxidrive

+1

这适用于OP的示例。但是如果XML内容超过〜8k字节,它可能会失败。 – dbenham

+0

这是真的。我测试了一个大约5MB的文件,这段代码不起作用。是否有可能改变大文件的逻辑? – user2593173