2017-05-25 117 views
2

我一直試圖通過不同的選項來解決這個問題,並且找不到正確的方法。 下面是XML文件:xmlstarlet根據文本值選擇同級

<?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應該如何得到它? 提前謝謝!

回答

2

您的XPath更改爲

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

,你會選擇x:name與價值,ListView,按要求。

+0

謝謝!這就是我一直在尋找的! –

+0

我不清楚在示例中「/:」代表的是什麼。 –

+2

@BillHileman:它是一個名稱空間前綴,由OP在xmlstarlet中通過'-N'定義,以覆蓋XML文檔中的默認名稱空間。請參閱[*** XPath如何處理XML名稱空間?***](https://stackoverflow.com/questions/40796231/how-does-xpath-deal-with-xml-namespaces) – kjhughes