如何将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>
答案 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);
答案 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)
// $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
数组中。如果收集了所有元素(name
,payable
和created
),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);