1

上下文:Windows 7、JScript、Adwords v201309

给定以下(经过修改的)XML,我如何使用 XPath 遍历budgetId?

<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如下所示),我会得到空值。

4

1 回答 1

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
于 2014-03-05T06:03:11.097 回答