4

我有以下xml:

<GetPurchaseContractResponse xmlns="http://payments.amazon.com/checkout/v2/2010-08-31/">
    <GetPurchaseContractResult>
        <PurchaseContract>
            <Id>amzn1.contract.1.1.1.d6779be6bf481167fe945</Id>
            <State>ACTIVE</State>
            <MerchantId>XXXXXXXXXX</MerchantId>
            <ExpirationTimeStamp>2012-07-19T10:55:28.134Z</ExpirationTimeStamp>
            <MarketplaceId>A1SDFERWERSDF</MarketplaceId>
        </PurchaseContract>
    </GetPurchaseContractResult>
    <ResponseMetadata>
        <RequestId>0db53477-d17a-11e1-ac3e-fd3e0de62222</RequestId>
    </ResponseMetadata>
</GetPurchaseContractResponse>

我想提取 ExpirationTimeStamp 元素的内容。

这是我的代码的相关部分(是的,我们使用的是 jscript 而不是 vbscript):

var xmlDoc = Server.CreateObject("Msxml2.DOMDocument.6.0");
xmlDoc.loadXML(xml);
var expNode = xmlDoc.getElementsByTagName("ExpirationTimeStamp");
if (expNode)
    Response.Write(expNode.text);

我也尝试过 selectSingleNode 而不是 getElementsByTagName

我已经尝试将 GetPurchaseContractResponse/GetPurchaseContractResult/PurchaseContract/ExpirationTimeStamp 作为 xpath 字符串,其中没有、一个和两个前导斜杠

Response.Write(xmlDoc.xml) 输出整个文档,因此加载正常。

expNode 变量没有得到任何东西。

我对 xpath 的了解几乎为零,所以我确信那里的一些专家可以指出我所犯的简单错误。

4

1 回答 1

7

用这个:

var xmlDoc = Server.CreateObject("Msxml2.DOMDocument.3.0");   
xmlDoc.loadXML(xml);   
var expNode = xmlDoc.documentElement.selectSingleNode("GetPurchaseContractResult/PurchaseContract/ExpirationTimeStamp");   
if (expNode)   
    Response.Write(expNode.text);  

其他一些“专家”可能会注意到我在这里作弊。在这里使用 XPath 的主要问题是您的 xml 指定了默认命名空间。XPath 始终将“无名称空间”作为其默认名称空间,因此要针对此 XML 使用 XPath,您需要首先指定名称空间别名,然后使用它为 XPath 中的所有名称添加前缀。

相反,我使用的是默认使用 XSL 模式(不是 XPath)作为其选择语言的 MSXML 版本 3。XSL 模式忽略名称空间和别名,因此对于简单的场景,它更易于使用。

如果你想使用 MSXML6,你可以使用.setProperty("SelectionLanguage", "XSL Pattern");.

如果你想使用 MSXML6 和 XPath 你可以使用.setProperty("SelectionNamespaces", xmlns:a='http://payments.amazon.com/checkout/v2/2010-08-31/'");,那么你的 XPath 就变成了a:GetPurchaseContractResult/a:PurchaseContract/a:ExpirationTimeStamp

于 2012-07-19T10:16:51.143 回答