我有以下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的了解几乎没有,所以我确信那里的一位专家可以指出我所犯的这个简单错误。
答案 0 :(得分: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中的所有名称添加前缀。
相反,我使用的是MSXML版本3,它默认使用XSL Pattern(不是XPath)作为其选择语言。 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
。