Как извлечь текст из элемента в строке 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,

Другие вопросы по тегам