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
我正在尝试使用批处理文件和 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