Context: Windows 7, JScript, Adwords v201309
Given the following (doctored) XML, how do I traverse to the budgetId using XPath?
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<ResponseHeader xmlns="https://adwords.google.com/api/adwords/cm/v201309">
<requestId>feeddcaa866554433222211000000000</requestId>
<serviceName>CampaignService</serviceName>
<methodName>get</methodName>
<operations>1</operations>
<responseTime>29</responseTime>
</ResponseHeader>
</soap:Header>
<soap:Body>
<getResponse xmlns="https://adwords.google.com/api/adwords/cm/v201309">
<rval>
<totalNumEntries>1</totalNumEntries>
<Page.Type>CampaignPage</Page.Type>
<entries>
<id>134557899</id>
<name>Test Search</name>
<budget>
<budgetId>123346677</budgetId>
<name>Test Search</name>
<period>DAILY</period>
<amount>
<ComparableValue.Type>Money</ComparableValue.Type>
<microAmount>1000000</microAmount>
</amount>
</budget>
</entries>
</rval>
</getResponse>
</soap:Body>
</soap:Envelope>
So far I've got the following script
var oXML = new ActiveXObject('Msxml2.DOMDocument.6.0');
oXML.async = false;
oXML.validateOnParse = false;
oXML.setProperty("SelectionLanguage", "XPath");
var ns = 'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"';
oXML.setProperty( "SelectionNamespaces", ns );
oXML.load("response.xml");
var x = oXML.selectSingleNode("/soap:Envelope/soap:Body");
//var x = oXML.selectSingleNode("//soap:Envelope/soap:Body/getResponse/rval/entries/budget/budgetId");
WScript.Echo(x.nodeName, x.nodeValue);
This works fine as far as traversing to /soap:Envelope/soap:Body
but if I try to go further, like /soap:Envelope/soap:Body/getResponse
, (or even /soap:Envelope/soap:Body/getResponse/rval/entries/budget/budgetId
as suggested below) I get null.
You should traverse through
<soap:Body>
instead of<soap:Header>
to get<budgetId>
:This is the exact path to
<budgetId>
given sample XML in this question :UPDATE :
Your xml has default namespace (
xmlns="...."
) besidessoap
namespace. In XML all elements without prefix considered in default namespace. And in XPath, all element without prefix considered has no namespace. So you'll need to define another prefix pointing to default namespace url (not sure if this is the correct syntax) :and use it in XPath statement :