基于文本值选择兄弟节点的xmlstarlet命令

3

我一直在尝试不同的方法来实现这个目标,但一直没有找到正确的方法。 以下是xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
  <types>
        <members>PriceRule__c.All</members>
        <members>PriceRule__c.None</members>
        <members>ProductRule__c.All</members>
        <members>Quote__c.All_Quotes</members>
        <members>SummaryVariable__c.All</members>
        <name>ListView</name>
  </types>
  <types>
        <members>*</members>
        <name>AnalyticSnapshot</name>
  </types>
</Package>

我希望能够获取与任何以PriceRule__c开头的“成员”节点的同一“类型”节点中的“名称”节点的文本。以下是我能找到的最远进展,实际上找到了这些节点的值:
echo $(xmlstarlet sel -N x="http://soap.sforce.com/2006/04/metadata" -t -v "//x:types/*[starts-with(text(),'PriceRule__c')]" test.xml)

这将会打印出以下内容:
PriceRule__c.All PriceRule__c.None

但是我需要的是获取值为ListView的方法。你知道应该使用什么XPath来获取吗?谢谢!

1个回答

3

将你的XPath更改为:

//x:types[starts-with(x:members,'PriceRule__c')]/x:name

你需要选择值为 ListViewx:name


我不清楚示例中的"x:"是什么或代表什么。 - Bill Hileman
2
@BillHileman:这是一个命名空间前缀,由OP通过xmlstarlet中的“-N”定义,以覆盖XML文档中的默认命名空间。请参见《XPath如何处理XML命名空间?》(https://dev59.com/1FkR5IYBdhLWcg3w0QRL)。 - kjhughes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接