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