Как получить 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
Другие вопросы по тегам