Как получить budgetId из XML-ответа AdWords?
Контекст: Windows 7, JScript, Adwords v201309
Учитывая следующий (подправленный) XML, как мне перейти к budgetId с использованием 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>
Пока у меня есть следующий скрипт
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);
Это прекрасно работает, поскольку переход к /soap:Envelope/soap:Body
но если я попытаюсь пойти дальше, вроде /soap:Envelope/soap:Body/getResponse
, (или даже /soap:Envelope/soap:Body/getResponse/rval/entries/budget/budgetId
как предложено ниже) я получаю ноль.
1 ответ
Вы должны пройти через <soap:Body>
вместо <soap:Header>
получить <budgetId>
:
/soap:Envelope/soap:Body/getResponse/.......
Это точный путь к <budgetId>
приведенный пример XML в этом вопросе:
/soap:Envelope/soap:Body/getResponse/rval/entries/budget/budgetId
ОБНОВИТЬ:
Ваш xml имеет пространство имен по умолчанию (xmlns="...."
) Кроме того soap
Пространство имен. В XML все элементы без префикса рассматриваются в пространстве имен по умолчанию. А в XPath все элементы без рассматриваемого префикса не имеют пространства имен. Поэтому вам нужно определить другой префикс, указывающий на URL-адрес пространства имен по умолчанию (не уверен, что это правильный синтаксис):
var ns = 'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:d="https://adwords.google.com/api/adwords/cm/v201309"';
и используйте его в операторе XPath:
/soap:Envelope/soap:Body/d:getResponse/d:rval/d:entries/d:budget/d:budgetId