2014-08-27 58 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; 
}