2012-11-05 60 views
0

我有下面的XML文檔(我已經清理出不相關的數據)中的一個元素的第一,第二和第三發生:什麼是XPath語法來獲得另一個元素

<?xml version="1.0"?> 
<NewOrderNotification xmlns="http://payments.amazon.com/checkout/2008-11-30/"> 
    <ProcessedOrder> 
    <ShippingServiceLevel>blah</ShippingServiceLevel> 
    <ProcessedOrderItems> 
     <ProcessedOrderItem> 
     <AmazonOrderItemCode>blah</AmazonOrderItemCode> 
     <Price> 
      <Amount>0.2</Amount> 
      <CurrencyCode>GBP</CurrencyCode> 
     </Price> 
     <ItemCharges> 
      <Component> 
      <Type>Principal</Type> 
      <Charge> 
       <Amount>0.2</Amount> 
       <CurrencyCode>GBP</CurrencyCode> 
      </Charge> 
      </Component> 
      <Component> 
      <Type>Shipping</Type> 
      <Charge> 
       <Amount>0.95</Amount> 
       <CurrencyCode>GBP</CurrencyCode> 
      </Charge> 
      </Component> 
      <Component> 
      <Type>PrincipalPromo</Type> 
      <Charge> 
       <Amount>0.0</Amount> 
       <CurrencyCode>GBP</CurrencyCode> 
      </Charge> 
      </Component> 
      <Component> 
      <Type>ShippingPromo</Type> 
      <Charge> 
       <Amount>0.0</Amount> 
       <CurrencyCode>GBP</CurrencyCode> 
      </Charge> 
      </Component> 
     </ItemCharges> 
     <ShippingCustomData>null</ShippingCustomData> 
     </ProcessedOrderItem> 
    </ProcessedOrderItems> 
    </ProcessedOrder> 
</NewOrderNotification> 

我想知道用於獲取5個不同<Amount>元件內的每個值的XPath語法:

即我怎樣提取每個下面的:

  • NewOrderNotification - ProcessedOrder - ProcessedOrderItems - ProcessedOrderItem - 價格 - 金額

  • NewOrderNotification - ProcessedOrder - ProcessedOrderItems - ProcessedOrderItem - ItemCharges - 組分(類型=原理) - 充電 - 金額

  • NewOrderNotification - ProcessedOrder - ProcessedOrderItems - ProcessedOrderItem - ItemCharges - 組分(類型=船運) - 充電 - 金額

  • NewOrderNotification - ProcessedOrder - ProcessedOrderItems - ProcessedOrderItem - ItemCharges - 組分(類型= PrincipalPromo) - 充電 - 金額

  • NewOrderNotification - ProcessedOrder - ProcessedOrderItems - ProcessedOrderItem - ItemCharges - 組分(類型= ShippingPromo) - 充電 - 金額

請注意在根元素的XMLNS。

這是JScript代碼我使用提取的元素:

var xmlDoc = Server.CreateObject("Msxml2.DOMDocument.6.0"); 
xmlDoc.setProperty("SelectionNamespaces", "xmlns:a='http://payments.amazon.com/checkout/2008-11-30/'"); 
xmlDoc.loadXML(xml); 
var node = xmlDoc.documentElement.selectSingleNode("XPATH_IN_HERE"); 
return node.text; 

回答

1

,第一量可以用先手:

//Price/Amount/text() 
#=> "0.2" 

對於其他四,您可以使用文本前面的兄弟Type元素得到它們的值:

//Charge[preceding-sibling::Type="Principal"]/Amount/text() 
#=> "0.2" 

//Charge[preceding-sibling::Type="Shipping"]/Amount/text() 
#=> "0.95" 

//Charge[preceding-sibling::Type="PrincipalPromo"]/Amount/text() 
#=> "0.0" 

//Charge[preceding-sibling::Type="ShippingPromo"]/Amount/text() 
#=> "0.0" 

我認爲這樣做。 (讓我知道如果我誤解你的問題。)

+0

我編輯了我的問題以包含我正在使用的那段代碼。也許它是我的代碼,但是我不能讓第一個工作。我還沒有嘗試過其他人。我也嘗試了// a:NewOrderNotification/ProcessedOrder/ProcessedOrderItems/ProcessedOrderItem/Price/Amount – Graham

+0

這可能有所幫助 - 我已經從xml中刪除了xmlns,並從我的代碼中刪除了setProperty行,然後您的答案就起作用。那麼我需要對xpath進行哪些修改才能處理xmlns? – Graham

+1

對不起,我正在使用ruby/Nokogiri,所以有點難以比較,但我也發現它在首先刪除命名空間後工作。使用nokogiri中的命名空間,必須將'xmnls:'附加到每個標記,例如:'// xmlns:Charge [before-sibling :: xmlns:Type =「ShippingPromo」]/xmlns:Amount/text()'等。 –

0

或者,如果你喜歡的絕對路徑簡稱

'/NewOrderNotification/ProcessedOrder/ProcessedOrderItems/ProcessedOrderItem/ItemCharges/Component[Type="Shipping"]/Charge/Amount/text()' 
+0

對不起 - 這不起作用 – Graham

0

我把我的快速和骯髒的XPath中的XSLT腳本。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:test="http://payments.amazon.com/checkout/2008-11-30/"> 
    <xsl:output indent="yes"/> 

    <!-- Standard if you can define namespaces --> 
    <xsl:variable name="amount1" select="//test:Price/test:Amount"/> 
    <!-- for cases with namespace problems --> 
    <xsl:variable name="amount2" select="//*[local-name() = 'Component'][1]/*[local-name() = 'Charge']/*[local-name() = 'Amount']"/> 
    <!-- you can add the other in the same way --> 


    <xsl:template match="/"> 
     <test> 
     <variable1><xsl:value-of select="$amount1"/></variable1>  
     <variable2><xsl:value-of select="$amount2"/></variable2> 
     </test> 
    </xsl:template> 
</xsl:stylesheet> 
+0

我該如何使用它? – Graham

+0

@Graham在unix系統中,你可以調用... xsltproc myXSLTStylesheet.xsl yourXMLFile.xml 你想在哪裏使用xpath? – OkieOth

+0

我在經典ASP(JScript)中使用它,所以unix對我來說沒有好處 – Graham

相關問題