【问题标题】:How can parse xml response in to variable and store in to table using php and mysql?如何使用 php 和 mysql 将 xml 响应解析为变量并存储到表中?
【发布时间】:2016-12-21 05:09:52
【问题描述】:

如何将 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 内容。我需要为每个域获取&lt;name&gt;&lt;payable&gt;&lt;created&gt; 元素值并将它们存储到一个表中。

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>

【问题讨论】:

    标签: php xml dom


    【解决方案1】:

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

    $xml响应

    <?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

    【讨论】:

      【解决方案2】:

      使用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 表达式选择 /response/result/ 下的所有 (//) domain 节点。 DOMXPath::query 将节点列表 Traversable 返回到 $domains 变量中。

      下一个循环从$domains 获取DOMElement 项目,内部循环将子节点收集到$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;
      }
      

      注意,域元素作为相对 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);
      

      【讨论】:

      • 谢谢。当我打印"printf( "Name: %s\nPayable: %s\nCreated: %s\n\n", $props['name'], $props['payable'], $props['created'] );" 时出现错误XML Parsing Error: no root element found Location: https://localhost/auto_dns_api/api.php Line Number 1, Column 1: 你知道它为什么会这样显示吗?
      • $xml = requestCurl( $xml ) 对吗?如果我这样定义会出现XML Parsing Error: syntax error Location: https://localhost/auto_dns_api/api.php Line Number 1, Column 1:Name: facebook.bayern 之类的错误
      • @samsam, this 是一个工作代码。您需要将$xml 变量设置为带有从远程主机下载的 XML 的字符串
      【解决方案3】:

      使用 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);
      

      【讨论】:

      • 我尝试了这种方法,但出现了一些错误。 $simple = requestCurl( $xml ); $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); 错误是 XML Parsing Error: syntax error Location: https://localhost/auto_dns_api/api.php Line Number 1, Column 1:Index array
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      相关资源
      最近更新 更多