XMLStarlet 命名空间 issue/can 未从 XML 中提取节点值

XMLStarlet namespace issue/can't extract node value from XML

我正在尝试使用批处理文件和 xmlstarlet(版本 1.6.1)将 XML 文件中的标记值分配给变量。 XML 文件有一个命名空间,通过在 xmlstarlet 命令中定义命名空间,我收到两个错误。

XML 文件 (myApp-app.xml) 如下所示:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<application xmlns="http://ns.adobe.com/air/application/17.0">
    <!-- A string value of the format <0-999>.<0-999>.<0-999> that represents application version which can be used to check for application upgrade. 
    Values can also be 1-part or 2-part. It is not necessary to have a 3-part value.
    An updated version of application must have a versionNumber value higher than the previous version. Required for namespace >= 2.5 . -->
    <versionNumber>1.0.0</versionNumber>
</application>

这是批处理文件:

@ECHO OFF
FOR /F %%i IN ('XML.EXE sel -t -c -N x="http://ns.adobe.com/air/application/17.0" "//x:versionNumber" "myApp-app.xml"') DO SET version=%%i
ECHO Version is %version%

(我也试过用“//x:application/versionNumber”代替“//x:versionNumber”)

我收到的错误是:

failed to load external entity "x"
Attempt to load network entity http://ns.adobe.com/air/application/17.0
failed to load external entity "/x:application/filename"
Version is NaN

我尝试更改参数的顺序,但这会导致命令完全损坏或出现错误消息“错误的命名空间选项:命名空间的格式应为

= ”,而我总是确保名称空间定义 x="http://ns.adobe.com/air/application/17.0"-N 后面声明。

任何人都可以看到可能导致错误的原因以及为什么它不起作用吗?

-N x=http... 选项必须紧跟在 sel 之后。在 FOR 构造之外,这有效

XMLSTARLET.EXE sel -N x=http://ns.adobe.com/air/application/17.0 -t -c //x:versionNumber myApp-app.xml

但它给出 <versionNumber xmlns="http://ns.adobe.com/air/application/17.0">1.0.0</versionNumber>。我认为您只是在 1.0.0 之后,所以您应该将 -c (--copy-of) 更改为 -v (--value-of)。

XMLSTARLET.EXE sel -N x=http://ns.adobe.com/air/application/17.0 -T -t -v //x:versionNumber myApp-app.xml

-T--text 的缩写(与默认的 XML 输出相反)。


FOR结构中,=需要被引用,以下所有工作:

FOR /F %%i IN ('XMLSTARLET.EXE sel -N "x=http://ns.adobe.com/air/application/17.0" -T -t -v //x:versionNumber myApp-app.xml') DO SET version=%%i
FOR /F %%i IN ('XMLSTARLET.EXE sel -N x"="http://ns.adobe.com/air/application/17.0 -T -t -v //x:versionNumber myApp-app.xml') DO SET version=%%i
FOR /F %%i IN ('XMLSTARLET.EXE sel -N x^=http://ns.adobe.com/air/application/17.0  -T -t -v //x:versionNumber myApp-app.xml') DO SET version=%%i