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要素のコンテンツを抽出したいと思います。

これが私のコードの関連部分です(はい、vbscriptではなくjscriptを使用しています):

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

getElementsByTagNameの代わりにselectSingleNodeも試しました

GetPurchaseContractResponse / GetPurchaseContractResult / PurchaseContract / ExpirationTimeStampをxpath文字列として試しましたが、先頭にスラッシュが1つも1つも2つありません。

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ではない)を使用するバージョン3のMSXMLを使用しています。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 に答える