通过 xmlstarlet 进行 XML 查询 - 返回嵌套属性

通过 xmlstarlet 进行 XML 查询 - 返回嵌套属性

示例文件:

<settings
xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
    <server>
        <id>fake</id>
        <username>username2</username>
        <password>aa2</password>
    </server>
    <server>
        <id>fake3</id>
        <username>username3</username>
        <password>aa3</password>
    </server>
    <server>
        <id>gitlab-company-name</id>
        <configuration>
            <httpHeaders>
                <property>
                    <name>Private-Token</name>
                    <value>glpat-faketokenvalue-E</value>
                </property>
            </httpHeaders>
        </configuration>
    </server>
</servers>
<mirrors>
[parially cut]
</mirrors>

现在我想分别返回settings-> servers-> server(其中id= gitlab-company-name)-> configuration-> httpHeaders-> property->namevalue- 的值。

我想到最好的办法是:

xmlstarlet sel -t -m '//_:server[_:id="gitlab-company-name"]' -v '_:configuration' -n ${HOME}/.m2/settings.xml

但它也会返回直到结果为止的所有空格(它们被 StackExchange 格式截断):

                    Private-Token
                    glpat-faketokenvalue-E                      
       

我将其通过管道传输到 sed 和 head/tail 但这是一个肮脏的解决方法。

有人能帮我解决这个问题吗?提前谢谢您。

答案1

例如,您可以使用:

xmlstarlet sel -t -m '//_:server[_:id="gitlab-company-name"]' -v '//_:name' -n -v "//_:value" -n ${HOME}/.m2/settings.xml

我所做的是在两个嵌套值(name, )之间进行拆分,并且它们之间value有一个换行符( switch)。-n

结果:

Private-Token
glpat-faketokenvalue-E

或者你也可以使用concatANSI C 字符串 ( $'') 来解析换行符,假设你的 shell 支持该语法:

xmlstarlet sel -t -m '//_:server[_:id="gitlab-company-name"]' -v $'concat(//_:name, "\n", //_:value, "\n")' ${HOME}/.m2/settings.xml

相关内容