解析XML文件并显示文本

时间:2015-08-28 16:17:08

标签: xml parsing powershell batch-file

我经常更新的XML文件,我想编写一个脚本(PowerShell或批处理文件)来显示它的版本。

<rules version="240">是文件的第一行。 我想解析240并将其输出到屏幕上。

4 个答案:

答案 0 :(得分:3)

有利于@FoxDeploy成为建议将XML解析为XML的唯一其他回答者,而不是将其标记化并将其作为平面文本进行拼写。这是他的方法的变体。

如果XML结构不严格遵循XML标准,则Microsoft.XMLDOM COM对象更容忍宽松格式化。这是另一种PowerShell替代方案。

$xml = new-object -COM Microsoft.XMLDOM
[void]$xml.load('desktop\test.xml')
$xml.async = 0
$xml.setProperty('SelectionLanguage', 'XPath')
$xml.documentElement.selectSingleNode('//rules').getAttribute('version')

或者,如果您想在批处理脚本中使用它,则通过JScript嵌入程序在Windows Scripting Host中使用相同的COM对象,如果从cmd控制台触发或双击,则执行速度会更快。 (以.bat扩展名保存。)

@if (@CodeSection == @Batch) @then

@echo off
setlocal

for /f %%I in ('cscript /nologo /e:Jscript "%~f0" "%CD%\test.xml"') do set "%%I"

set version
set /P "=Press any key to exit..."<NUL & pause >NUL & echo;

goto :EOF

@end // end batch / begin JScript

var DOM = WSH.CreateObject('Microsoft.XMLDOM');

with (DOM) {
    load(WSH.Arguments(0));
    async = false;
    setProperty('SelectionLanguage', 'XPath');
}

var rules = DOM.documentElement.selectSingleNode('//rules');
WSH.Echo('version=' + rules.getAttribute('version'));

答案 1 :(得分:1)

我假设您有一个类似于此的文件,名为books.xml。

<?xml version="1.0"?>
<?rules version="240"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>

使用Get-Content命令并指定为[xml],PowerShell可以非常轻松地本地解析XML文件。

 [xml](Get-Content .\book.xml)

xml           rules         catalog
---           -----         -------
version="1.0" version="240" catalog

从这一点开始,您可以使用Select cmdlet轻松选择版本。

[xml](Get-Content .\book.xml) | select -expand Rules
version="240"

在这个例子中,我有一些book.xml文件,每个文件都有不同的版本。

 Dir book* | ForEach {(Get-Content $_.FullName) -as [xml]}

xml           rules         catalog
---           -----         -------
version="1.0" version="240" catalog
version="1.0" version="250" catalog
version="1.0" version="350" catalog

答案 2 :(得分:0)

尝试sed!

more <insert your xml file here> | grep 'rules version' | sed 's/.\+\<rules version=\"//g' | sed 's/".\+$//g'ere

答案 3 :(得分:0)

应该这样做。

     for /f tokens^=2^ delims^=^" %%A in ('findstr /n . input.txt ^| findstr /b ^^1:')do  @echo %%A

输出:

    240