Как извлечь текст из элемента в строке XML в классическом ASP
У меня есть следующий 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 практически ничего не значат, поэтому я уверен, что некоторые эксперты могут указать на простую ошибку, которую я делаю.
1 ответ
Использовать этот:
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 всегда имеет "пространство имен" в качестве пространства имен по умолчанию, поэтому для использования XPath с этим XML вам необходимо сначала указать псевдоним пространства имен, а затем использовать его для добавления префикса ко всем именам в XPath.
Вместо этого я использую версию 3 MSXML, которая по умолчанию использует XSL Pattern (не XPath) в качестве языка выбора. XSL Pattern игнорирует пространства имен и псевдонимы, поэтому для простого сценария его проще использовать.
Если вы хотите использовать 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
,