【问题标题】:xmlstarlet select sibling based on text valuexmlstarlet 根据文本值选择同级
【发布时间】:2017-05-26 04:00:34
【问题描述】:

我一直在尝试使用不同的选项来解决这个问题,但找不到正确的方法。 这是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 应该如何实现吗? 提前谢谢!

【问题讨论】:

    标签: xml xpath xmlstarlet


    【解决方案1】:

    将您的 XPath 更改为

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

    然后您将根据要求选择值为ListViewx:name

    【讨论】:

    • 我不清楚示例中的“x:”代表什么。
    • @BillHileman:它是一个命名空间前缀,由 OP 通过 xmlstarlet 中的-N 定义,以覆盖 XML 文档中的默认命名空间。见How does XPath deal with XML namespaces?
    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2022-01-03
    • 2018-07-21
    • 1970-01-01
    • 2017-01-30
    • 2021-08-20
    相关资源
    最近更新 更多