2014-08-27 36 views
2

新於一般解析XML和XML ...我工作過的例子,但也有幾件事情我想不通:我目前使用的東西,例如XML解析在PHP - 讓特定值

作爲這個值:

$order->reference = $doc->getElementsByTagName("reference")->item(0)->nodeValue; 

我認識到是獲得x的第一次出現的值,它工作正常。

現在,因爲customerpurchaser在它們內部具有相同的值,所以我如何定位其中一個或另一個?每個實例最多隻有一個實例。

另外,我預計多個<orderItem><orderItems>之間...我怎樣才能遍歷這些...最好創建一個像數組一樣,因爲我不知道會有多少。

示例XML:

<order> 
    <reference/> 
    <status>open | request | requested | acceptance | accepted | fulfillment | fulfilled | completion | completed | canceled | failed</status> 
    <statusChanged>2010-08-15T00:00:00.000Z</statusChanged> 
    <test>true | false</test> 
    <due>2010-08-15T00:00:00.000Z</due> 
    <returnStatus>none | partial | full</returnStatus> 
    <currency/> 
    <referrer/> 
    <originIp/> 
    <total>0.0</total> 
    <tax>0.0</tax> 
    <shipping>0.0</shipping> 
    <sourceName/> 
    <sourceKey/> 
    <sourceCampaign/> 
    <customer> 
    <firstName/> 
    <lastName/> 
    <company/> 
    <email/> 
    <phoneNumber/> 
    </customer> 
    <purchaser> 
    <firstName/> 
    <lastName/> 
    <company/> 
    <email/> 
    <phoneNumber/> 
    </purchaser> 
    <address> 
    <addressLine1/> 
    <addressLine2/> 
    <city/> 
    <region/> 
    <regionCustom/> 
    <postalCode/> 
    <country/> 
    </address> 
    <orderItems> 
    <orderItem> 
     <productDisplay/> 
     <productName/> 
     <quantity>0</quantity> 
     <subscriptionReference/> 
    </orderItem> 
    </orderItems> 
    <payments> 
    <payment> 
     <status>open | request | requested | acceptance | accepted | fulfillment | fulfilled | completion | completed | canceled | failed</status> 
     <statusChanged>2010-08-15T00:00:00.000Z</statusChanged> 
     <methodType>paypal | creditcard | test | bank | check | purchase-order | free</methodType> 
     <declinedReason>internal-error | unsupported-country | expired-card | declined | risk | processor-risk | connection | unknown | cc-address-verification | cc-cvv | voice-auth</declinedReason> 
     <currency/> 
     <total>0.0</total> 
    </payment> 
    </payments> 
</order> 

編輯:

獲取沒有錯誤但沒有值的客戶/購買者。

private function parseFsprgOrder($doc) { 
    //show values coming in 
    echo '<pre>',print_r($doc, 1),'</pre>'; 

    $order = new FsprgOrder(); 

    $order->reference = $doc->getElementsByTagName("reference")->item(0)->nodeValue; 
    $order->status = $doc->getElementsByTagName("status")->item(0)->nodeValue; 
    $order->statusChanged = strtotime($doc->getElementsByTagName("statusChanged")->item(0)->nodeValue); 
    $order->test = $doc->getElementsByTagName("test")->item(0)->nodeValue; 
    $order->due = strtotime($doc->getElementsByTagName("due")->item(0)->nodeValue); 
    $order->returnStatus = $doc->getElementsByTagName("returnStatus")->item(0)->nodeValue; 
    $order->currency = $doc->getElementsByTagName("currency")->item(0)->nodeValue; 
    $order->referrer = $doc->getElementsByTagName("referrer")->item(0)->nodeValue; 
    $order->originIp = $doc->getElementsByTagName("originIp")->item(0)->nodeValue; 
    $order->total = $doc->getElementsByTagName("total")->item(0)->nodeValue; 
    $order->tax = $doc->getElementsByTagName("tax")->item(0)->nodeValue; 
    $order->shipping = $doc->getElementsByTagName("shipping")->item(0)->nodeValue; 
    $order->sourceName = $doc->getElementsByTagName("sourceName")->item(0)->nodeValue; 
    $order->sourceKey = $doc->getElementsByTagName("sourceKey")->item(0)->nodeValue; 
    $order->sourceCampaign = $doc->getElementsByTagName("sourceCampaign")->item(0)->nodeValue; 

    //customer info 
    $customerNodes = $doc->getElementsByTagName("customer")->item(0); 

    if($customerNodes->length > 0) 
    { 
     $customer = new FsprgCustomer(); 

     $customer->firstName = $customerNodes->getElementsByTagName("firstName")->item(0)->nodeValue; 
     $customer->lastName = $customerNodes->getElementsByTagName("lastName")->item(0)->nodeValue; 
     $customer->company = $customerNodes->getElementsByTagName("company")->item(0)->nodeValue; 
     $customer->email = $customerNodes->getElementsByTagName("email")->item(0)->nodeValue; 
     $customer->phoneNumber = $customerNodes->getElementsByTagName("phoneNumber")->item(0)->nodeValue; 

     $order->customer = $customer; 
    } 

    //purchaser info 
    $purchaserNodes = $doc->getElementsByTagName("purchaser")->item(0); 

    if($purchaserNodes->length > 0) 
    { 
     $purchaser = new FsprgPurchaser(); 

     $purchaser->firstName = $purchaserNodes->getElementsByTagName("firstName")->item(0)->nodeValue; 
     $purchaser->lastName = $purchaserNodes->getElementsByTagName("lastName")->item(0)->nodeValue; 
     $purchaser->company = $purchaserNodes->getElementsByTagName("company")->item(0)->nodeValue; 
     $purchaser->email = $purchaserNodes->getElementsByTagName("email")->item(0)->nodeValue; 
     $purchaser->phoneNumber = $purchaserNodes->getElementsByTagName("phoneNumber")->item(0)->nodeValue; 

     $order->purchaser = $purchaser; 
    } 

    return $order; 
} 

class FsprgCustomer { 
    public $firstName; 
    public $lastName; 
    public $company; 
    public $email; 
    public $phoneNumber; 
} 

class FsprgPurchaser { 
    public $firstName; 
    public $lastName; 
    public $company; 
    public $email; 
    public $phoneNumber; 
} 

class FsprgOrder { 
    public $reference; 
    public $status; 
    public $statusChanged; 
    public $test; 
    public $due; 
    public $returnStatus; 
    public $currency; 
    public $referrer; 
    public $originIp; 
    public $total; 
    public $tax; 
    public $shipping; 
    public $sourceName; 
    public $sourceKey; 
    public $sourceCampaign; 
} 
+0

值要從客戶,購買者和對的OrderItems得到了什麼?你的答案在於你的問題。 – FMQB 2014-08-27 18:07:30

+0

沒有開玩笑...我知道我想要得到什麼...我不知道如何瞄準他們。我看了各種教程,但一切都使用simplexml,我會堅持提供給我的例子。 – user756659 2014-08-27 18:10:20

回答

2
$customerNodes=order->getElemensByTagName('customer'); 
if($customerNodes->length>0) 
    $customer=$customerNodes->item(0); 
$purchaseNodes=order->getElemensByTagName('purchase'); 
if($purchaseNodes->length>0) 
    $purchase=$purchaseNodes->item(0); 
$orderItemNodes=order->getElemensByTagName('orderItem'); 
if($orderItemNodes->length>0) 
    foreach($orderItemNodes as $orderItemNode){ 
     //process $orderItemNode  
    } 
+0

試圖合併這個,但得到一個錯誤......我看到你要去的邏輯。如果存在任何東西,將「客戶」存儲爲自己的客戶,然後執行與我僅在「客戶」內部相同的流程。 – user756659 2014-08-27 20:22:28

+0

您可以從這裏獲得客戶,購買,訂購項目。接下來您可以使用nodeValue訪問屬性。 – FMQB 2014-08-28 03:27:21

+0

我在下面添加了我自己的解決方案,它適用於我 - 必須對其進行一些更改才能使其正常工作。謝謝 – user756659 2014-08-28 19:14:47

0

檢查DOMXPath::evaluate()。這使您可以使用XPath表達式從DOM中獲取值。

抓取的節點列表:

$xpath - new DOMXPath($domDocument); 
$nodeList = $xpath->evaluate('/order'); 

或者一個標值:

$xpath - new DOMXPath($domDocument); 
$string = $xpath->evaluate('string(/order/customer/firstName)'); 
+0

我想堅持使用相同的格式,但如果我無法弄清楚這一點會回來。謝謝。 – user756659 2014-08-27 21:02:20

+0

這是dom擴展的一部分。把它看作getElementsByTagName()的一個強大版本。 – ThW 2014-08-27 21:44:23

0
//customer info 
$customerNodes = $doc->getElementsByTagName("customer"); 

if($customerNodes->length > 0) 
{ 
    $customer = new FsprgCustomer(); 

    $customer->firstName = $customerNodes->item(0)->getElementsByTagName("firstName")->item(0)->nodeValue; 
    $customer->lastName = $customerNodes->item(0)->getElementsByTagName("lastName")->item(0)->nodeValue; 
    $customer->company = $customerNodes->item(0)->getElementsByTagName("company")->item(0)->nodeValue; 
    $customer->email = $customerNodes->item(0)->getElementsByTagName("email")->item(0)->nodeValue; 
    $customer->phoneNumber = $customerNodes->item(0)->getElementsByTagName("phoneNumber")->item(0)->nodeValue; 

    $order->customer = $customer; 
}