【问题标题】:Specify Credentials in XMLReader在 XMLReader 中指定凭据
【发布时间】:2018-02-26 18:33:37
【问题描述】:

我正在尝试使用 XMLReader 访问 XML 提要(使用用户名和密码)。
以前,我已将凭据集成到 url 中(例如http://username:password@mysite.com);但是,这现在不起作用。

我在最后检查我的代码时得到'XPath query failed for bio'

是否可以在 XMLReader 中指定用户名/密码?

感谢任何线索。

我的代码(经过编辑以包含我的 Curl 代码):

<?php
$secondary_user_id = "jsmith";
$url_bio = "http://username:password@mysite.com";

//
$a_username='username';
$a_password='password';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url_bio);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($ch, CURLOPT_USERPWD, $a_username . ':' . $a_password);
$result = curl_exec($ch);
$a_error = curl_error($ch);
echo '<br>'.$a_error.'<br>';
curl_close($ch);
//



$reader = new XMLReader();
//$reader->open($url_bio);
$reader->XML($result);
while ($reader->read()) 
{

if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'Users') 
    {
            //the code works to this point  
            echo 'success<br>';
            $node = $reader->expand();
            $doc = new DOMDocument('1.0','UTF-8');//
            $n = $doc->importNode($node,true);
            $doc->appendChild($n);
            //$xml_bio_report = simplexml_import_dom($doc->importNode($reader->expand(),true));//
            $xml_bio_report =  simplexml_import_dom($n);//

        $xml_bio_report->registerXPathNamespace('xlink','http://www.w3.org/1999/xlink');
        $xml_bio_report->registerXPathNamespace('dmu','http://www.digitalmeasures.com/schema/user-metadata');

          //echo $xml_bio_report->Users->User;


        $xml_bio_report_abbrev = $xml_bio_report->xpath('//User[@SecondaryID="'.$secondary_user_id.'"]');

        if ($xml_bio_report_abbrev){
            echo '<h1>'.$xml_bio_report_abbrev[0]['username'].'</h1>';
            echo '<h1>'.$xml_bio_report_abbrev[0]['SecondaryID'].'</h1>';

        } else {
            echo 'XPath query failed for bio';  
        }

}
}
?>

【问题讨论】:

  • 登录不是 XMLReader 的责任。本质上它只是调用 file_get_contents(),这使得 HTTP 客户端非常简单。如果您需要适当的身份验证,请考虑使用 cURL(或其库)发送所需的 HTTP 请求。
  • 谢谢。我已经更新了我的代码以使用 cURL 显示我的测试。在一定程度上是成功的。 XMLReader 正在读取 cURL 结果,但是 simplexml_import_dom 有问题吗?
  • @Dormilich 不是file_get_contents(),而是fopen()。它打开一个流并逐部分读取它。

标签: php xml simplexml credentials xmlreader


【解决方案1】:

XMLReader::open() 使用 PHP 流包装器。这是一个名为libxml_set_streams_context() 的函数,它允许为下一次打开/加载调用设置上下文。

$opts = array(
    'http' => array(
        'user_agent' => 'PHP libxml agent',
    )
);

$context = stream_context_create($opts);
libxml_set_streams_context($context);

$reader = new XMLReader();
$reader->open($url_bio);
//...

【讨论】:

    猜你喜欢
    • 2020-10-26
    • 2013-01-28
    • 1970-01-01
    • 2011-06-16
    • 2011-03-29
    • 2014-09-16
    • 2022-11-10
    • 2021-03-10
    • 1970-01-01
    相关资源
    最近更新 更多