XMLStarlet名称空间问题/无法从XML中提取节点值

时间:2015-05-20 11:53:52

标签: xml batch-processing xmlstarlet

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

(我也尝试使用&#34; // x:application / versionNumber&#34;而不是&#34; // x:versionNumber&#34;)

我收到的错误是:

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

我尝试更改参数的顺序,但这会导致完全破坏的命令或错误消息&#34; 错误的命名空间选项:命名空间的格式应为&lt; prefix&gt; =&lt; url&gt; &#34;,而我总是确保命名空间定义 x =&#34; http://ns.adobe.com/air/application/17.0" -N

任何人都可以看到可能导致错误的原因以及它无法正常工作的原因吗?

1 个答案:

答案 0 :(得分:3)

-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