繁体   English   中英

如何使用命令行 (cmd/batch) 解析 XML 文件

[英]How to parse a XML file with Command Line (cmd/batch)

我有一个 XML 文件Testing.Config具有以下内容:

<?xml version="1.0" encoding="utf-8"?>
<connectionStrings>
    <add name="name1" connectionString="user id=id1;password=password1;"/>
    <add name="name2" connectionString="user id=id2;password=password2;"/>
    <add name="name3" connectionString="user id=id3;password=password3;"/>
</connectionStrings>

我需要解析此文件并在由提供的属性标识的特定标记的属性中获取idpassword键值对,例如"name=name1"

例子

输入:

 name=name1

回报:

 id=id1
 password=password1
@echo off

set "xml_file=test.xml"
set /p search_for=Enter name:

for /f "skip=2 tokens=3,9 delims=;= " %%a in ('find """%search_for%""" "%xml_file%"') do (

    set "name=%%~a"
    set "pass=%%b"
)

echo name : %name%
echo pass : %pass%

如果所有connectionStrings都在分隔的行上,并且每个字符串都在一行上。更改xml_file的位置


您也可以尝试使用xpath.bat (根据我的更好选项)-small脚本,它允许您通过xpath表达式获取xml值,而无需使用外部二进制文件:

call xpath.bat connection.xml "//add[@name = 'name1']/@connectionString"

既然你(在问题的评论中)指出powershell也没关系,请将以下代码放在脚本文件中(假设为Foo.ps1

param
(
    [Parameter(Mandatory=$true)]
    [string] $ConfigFilePath,

    [Parameter(Mandatory=$true)]
    [string] $Name
)

([xml](Get-Content -LiteralPath $ConfigFilePath)).connectionStrings.add |
Where-Object {$_.name -eq $name} |
ForEach-Object {($_.connectionString -split ' ')[1] -split ';'}

然后使用参数运行脚本以获取输出。

万一有人像我一样寻找这个......由npocmaka链接的xpath.bat效果很好,但不适用于文件一网络路径,例如\server\foo\bar.xml。 而且我无法让 Vikus 的 PS 脚本用于属性。 所以...我设法将 Vikus 的 PS 变成了这样:

param
(
    [Parameter(Mandatory=$true)]
    [string] $XMLFile,
    [Parameter(Mandatory=$true)]
    [string] $Xpath
)
[xml]$xml = Get-Content -Path $XMLFile
$value = Select-XML -xml $xml -xpath $Xpath
$value.ToString()

然后我将其折叠到此以用于 a.cmd 文件:

set psc="(Select-XML -xml ([xml](Get-Content -Path %xmlfile%)) -xpath %xpath%).ToString()"
for /f %%a in ('powershell %psc%') do set myvar=%%a

尽管值得注意的是 %xmlfile% 和 %xpath% 都不能有空格。 这需要 escaping 所有括号,以便 powershell 命令不必用双引号括起来:

for /F %a in ('powershell ^(Select-XML -xml ^([xml]^(Get-Content -Path "test.xml"^)^) -xpath "/Computers/Computer/Name/@id"^).ToString^(^)') do @echo %a

FWIW,它们都比我原来脆弱的怪物慢得多:

@for /F eol^=^#^tokens^=2^,5^,7^ delims^=^<^>^" %%i in (%xmlfile%) do @(
    @if "%targetnodename% ATTR1=" == "%%i" (
        set myvar1=%%j
        set myvar1=%%k
    )
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM