php - php 中的 xml 解析 - 获取特定值

标签 php xml

解析 XML 和一般 XML 的新手...我正在研究一个示例,但有一些事情我无法弄清楚:

我目前正在使用诸如此类的值:

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

我意识到这是获取 x 第一次出现的值,并且工作正常。

现在,从customer开始和purchaser它们具有相同的值(value)观,我如何才能瞄准其中一个或另一个?每个最多只能有一个实例。

此外,我希望有多个 <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>

编辑:

没有错误,但没有为客户/购买者带来任何值(value)。

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;
}

最佳答案

$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    
    }

关于php - php 中的 xml 解析 - 获取特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25534110/

相关文章:

php - 如何维护多个 AJAX 调用之间的 mysql 连接?

php - yii2:显示标签而不是 bool 复选框的值

java - xpath 不能在 java 中工作

xml - 多语言 sitemap.xml 文件

jquery - jQuery XML Ajax 中的 If 语句

javascript - 如何在 javascript 函数中传递值

用于解析 JSON 并添加到数据库 mysql 的 PHP

php - 如何用php验证xml

xml - "Content is not allowed in prolog"错误但在 XML 声明之前什么也没有

r - 使用 R 中的 Xpath 根据另一个属性及其父属性获取节点的属性