2017-05-25 7 views
2

Ich habe versucht, mit verschiedenen Optionen durch zu kommen und konnte nicht den richtigen Weg finden, es zu tun. Hier ist die XML-Datei:xmlstarlet wählen Geschwister basierend auf Text-Wert

<?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> 

Ich mag den Text der „namen“ Knoten erhalten können, die in den gleichen „Typen“ Knoten für alle „Mitglieder“ Knoten, die mit PriceRule__c beginnen. Hier ist die am weitesten Ich konnte das war tatsächlich die Werte dieser Knoten zu finden:

echo $(xmlstarlet sel -N x="http://soap.sforce.com/2006/04/metadata" -t -v "//x:types/*[starts-with(text(),'PriceRule__c')]" test.xml) 

Dies gibt:

PriceRule__c.All PriceRule__c.None 

Aber was ich brauche, ist ein Weg, um den Wert Listview zu erhalten Irgendeine Idee, wie der XPath sein sollte, um das zu bekommen? Vielen Dank im Voraus!

Antwort

2

Ihre XPath ändern zu

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

und Sie werden den x:name mit Wert auswählen, ListView, wie gewünscht.

+0

danke! Das habe ich gesucht! –

+0

Ich bin nicht klar, was das "x:" im Beispiel für/darstellt. –

+2

@BillHileman: Dies ist ein Namespace-Präfix, das von OP über '-N' in xmlstarlet definiert wird, um den Standard-Namespace im XML-Dokument abzudecken. Siehe [*** Wie behandelt XPath XML-Namespaces? ***] (https://stackoverflow.com/questions/40796231/how-does-xpath-deal-with-xml-namespaces) – kjhughes

Verwandte Themen