通过 xmlstarlet 进行 XML 查询

通过 xmlstarlet 进行 XML 查询

Maven 设置文件如下所示:

<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>fake31</id>
            <username>username1</username>
            <password>bb</password>
        </server>
        <server>
            <id>fake</id>
            <username>username2</username>
            <password>aa2</password>
        </server>
        <server>
            <id>fake3</id>
            <username>username3</username>
            <password>aa3</password>
        </server>
    </servers>
    <mirrors>
    [parially cut]
    </mirrors>
</settings>

我必须 - 使用 xmlstarlet (?) - 返回username元素的值id = fake

我分析了许多例子并进行了无数次尝试,但都失败了。

当我/settings/servers/server[id='fake']/username使用https://www.freeformatter.com/xpath-tester.html,结果正是我所期望的。

有人能帮助我吗?提前谢谢您。

答案1

这个显而易见的解决方案不起作用,因为没有引用xmlns你正在使用的命名空间。(好吧,从技术上讲它可以工作,但它找不到任何东西。这也曾经困扰过我。)

xmlstarlet sel -t -m '//server[id="fake"]' -v 'username' -n xmlfile

相反,您需要明确指定命名空间,-N或者使用默认命名空间占位符,_

xmlstarlet sel -N mvn="http://maven.apache.org/SETTINGS/1.0.0" -t -m '//mvn:server[mvn:id="fake"]' -v 'mvn:username' -n xmlfile

xmlstarlet sel -t -m '//_:server[_:id="fake"]' -v '_:username' -n xmlfile

我更喜欢使用默认占位符。无论哪种方式,示例的输出,

username2

//server对于阅读此答案的其他人,我可能应该指出,尽管我在示例中使用了更短的 XPath ,但您的 XPath//settings/servers/server也(几乎)正确,并为相关元素提供了更严格的目标

xmlstarlet sel -t -m '//_:settings/_:servers/_:server[_:id="fake"]' -v '_:username' -n xmlfile

相关内容