如何解析xml响应变量并使用php和mysql存储到表中?

时间:2016-12-21 05:09:52

标签: php xml dom

如何将XML响应解析为变量并存储到表中?

使用以下脚本获取XML响应:

<?php
require_once 'db.php';
define( 'HOST', 'https://gateway.autodns.com');
define( 'XML_FILE', 'test.xml' );
$xml = implode( "", file(XML_FILE) );
header( 'Content-Type: text/xml' );
echo requestCurl( $xml );
function requestCurl( $data )
{
    $ch = curl_init( HOST );
    curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
    curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
    if( !$data = curl_exec( $ch )) {
        echo 'Curl execution error.', curl_error( $ch ) ."\n"; return FALSE;
    }
    curl_close( $ch );
    return $data;
}

$api_insert = $mysqli->query("INSERT INTO api name, created, payable VALUES ('', '', '')");
?>

echo requestCurl( $xml );打印如下所示的XML内容。我需要为每个域提取<name><payable><created>元素值,并将它们存储到表中。

XML

<response>
<result>
<data>
<summary>2</summary>
<domain>
<name>facebook.bayern</name>
<payable>2017-05-06 13:34:46</payable>
<domainsafe>false</domainsafe>
<dnssec>false</dnssec>
<owner>
<user>dhabi</user>
<context>4</context>
</owner>
<created>2015-05-06 13:34:46</created>
<updated>2016-12-20 11:29:10</updated>
</domain>
<domain>
<name>google.com</name>
<payable>2017-04-08 22:04:04</payable>
<domainsafe>false</domainsafe>
<dnssec>false</dnssec>
<owner>
<user>dhabi</user>
<context>4</context>
</owner>
<created>2016-04-08 22:04:05</created>
<updated>2016-12-20 17:44:39</updated>
</domain>
</data>
<status>
<code>S0105</code>
<text>Domaindaten wurden erfolgreich ermittelt.</text>
<type>success</type>
</status>
</result>
<stid>20161221-app4-40522</stid>
</response>

3 个答案:

答案 0 :(得分:2)

PHP有一个名为simplexml_load_string的漂亮方法,它的作用是将XML结构化字符串加载到易于使用的对象中。假设您有一个名为$xmlResponse的字符串变量,其中包含以下格式正确的XML:

$ xmlResponse

<?xml version='1.0'?>
<business>
    <company>Code Blog</company>
    <owner>Nic Raboy</owner>
    <employees>
        <employee>
            <firstname>Nic</firstname>
            <lastname>Raboy</lastname>
        </employee>
        <employee>
            <firstname>Maria</firstname>
            <lastname>Campos</lastname>
        </employee>
    </employees>
</business>

在PHP中执行以下操作将为我们提供一个非常好的对象:

$xml = simplexml_load_string($xmlResponse);

Reference

答案 1 :(得分:0)

使用XML解析使XML成为数组 以下示例

$simple = "<para><note>simple note</note></para>";
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
xml_parser_free($p);
echo "Index array\n";
print_r($index);
echo "\nVals array\n";
print_r($vals);

答案 2 :(得分:0)

使用DOM extension

// $xml = 'XML content';
$doc = new DOMDocument;
$doc->loadXML($xml);
$xpath = new DOMXPath($doc);
$expr = '/response/result//domain';
$domains = $xpath->query($expr);

foreach ($domains as $d) {
  $props = [];
  foreach ($d->childNodes as $child) {
    $props[$child->nodeName] = $child->nodeValue;
  }

  if (
    isset($props['name']) &&
    isset($props['payable']) &&
    isset($props['created'])
  )
  {
    printf(
      "Name: %s\nPayable: %s\nCreated: %s\n\n",
      $props['name'],
      $props['payable'],
      $props['created']
    );
  }
}

XPath表达式选择//下的所有(domain/response/result/个节点。 DOMXPath::query会将Traversable个节点列表返回到$domains变量。

下一个循环从DOMElement获取$domains项,内循环将子节点收集到$props数组中。如果收集了所有元素(namepayablecreated),printf会将它们打印到标准输出。

输出

Name: facebook.bayern
Payable: 2017-05-06 13:34:46
Created: 2015-05-06 13:34:46

Name: google.com
Payable: 2017-04-08 22:04:04
Created: 2016-04-08 22:04:05

您可以使用额外的XPath调用来获取特定元素,而不是获取所有子节点:

$children = $xpath->query('*[self::name or self::payable or self::created]', $d);
if ($children->length != 3) {
  continue;
}

注意,domain元素作为相对XPath表达式的上下文节点传递。

为了使用MySQLi将值存储到数据库中,请使用以下内容替换printf调用:

$sql = sprintf(
  'INSERT INTO `api` (name, created, payable) VALUES ("%s", "%s", "%s")',
  $mysqli->real_escape_string($props['name']),
  $mysqli->real_escape_string($props['payable']),
  $mysqli->real_escape_string($props['created'])
);
$result = $mysqli->query($sql);