【问题标题】:How to extract a value from an xml object?如何从 xml 对象中提取值?
【发布时间】:2016-05-26 16:24:19
【问题描述】:

我正在尝试从这个 XML ($xml) 中打印一个值,我尝试了每一种方法来做到这一点,但没有。

我正在使用 ASMX Web 服务,因此我必须将对象响应解析为 XML,并使用 XMLSerializer 来完成。

我只是想知道我在从整个 XML 中打印单个值时做错了什么。

这是我的代码:

require_once('nusoap/lib/nusoap.php');
require_once 'xmlserializer/XML/Serializer.php';
$client = new SoapClient('https://omegasandbox.megasys.net:444/Client/WebServices/CustomerPortal.asmx?WSDL');
$token = $client->Login(array('clientNumber' => 'xxx', 'userName' => 'xxxxxx', 'password' => 'xxxxxxx'));

echo '<br><br>';

$realtoken = $token->LoginResult;
$summary = $client->GetAccountSummary(array('token'=>$realtoken, 'accountNumber' => 1111));
$summary = json_encode($summary);
$data = json_decode($summary, true);

// An array of serializer options.
$serializer_options = array (
  'addDecl' => TRUE,
  'encoding' => 'ISO-8859-1',
  'indent' => '  ',
  'rootName' => 'json',
  'mode' => 'simplexml'
); 

$Serializer = &new XML_Serializer($serializer_options);
$status = $Serializer->serialize($data);

if (PEAR::isError($status)) {
  die($status->getMessage());
}

$xml = $Serializer->getSerializedData();

echo "echo xml <br><br>";
echo $xml; 
echo "<br><br>";
echo "echo xml2<br><br>";
echo $xml2 =  htmlspecialchars_decode($xml);

希望你能帮助我,谢谢。


编辑:

最后我想出了最后一步。这是最终代码:

<?php 
require_once('nusoap/lib/nusoap.php');
require_once 'xmlserializer/XML/Serializer.php';
$client = new SoapClient('https://omegasandbox.megasys.net:444/Client/WebServices/CustomerPortal.asmx?WSDL');
$token = $client->Login(array('clientNumber' => 'xxx', 'userName' => 'xxxxx', 'password' => 'xxxxxx'));

echo '<br><br>';

$realtoken = $token->LoginResult;
$summary = $client->GetAccountSummary(array('token'=>$realtoken, 'accountNumber' => 11111));
$summary = json_encode($summary);
$data = json_decode($summary, true);

// An array of serializer options.
$serializer_options = array (
  'addDecl' => TRUE,
  'encoding' => 'ISO-8859-1',
  'indent' => '  ',
  'rootName' => 'json',
  'mode' => 'simplexml'
); 

$Serializer = &new XML_Serializer($serializer_options);
$status = $Serializer->serialize($data);

if (PEAR::isError($status)) {
  die($status->getMessage());
}

$xml = $Serializer->getSerializedData();

ob_start();
echo $xml;
$data = ob_get_contents();
ob_end_clean();
$order = simplexml_load_string(htmlspecialchars_decode($data));

//This was the final step.
echo $order->GetAccountSummaryResult[0]->any[0]->GetAccountSummary[0]->LoanAmount;
?>

感谢@Rasclatt 的大力帮助。

【问题讨论】:

    标签: php xml printing display serialization


    【解决方案1】:

    大概$xml 的结果是字符串形式的(尽管它可能来自__toString() 方法而不是真正的字符串,因此如果不先将字符串输出到输出缓冲区,此方法可能无法工作(其中是,我敢肯定,这不是课程的意图)但你可以在那时使用simplexml_load_string()

    print_r(simplexml_load_string($xml));
    

    只是图片的一部分:

    $xml = '<GetAccountSummary xmlns="">
        <OpenDate>02/19/2016</OpenDate>
        <LoanAmount>$15,000.00</LoanAmount>
        <Tenn>48</Tenn>
        <Frequency>Monthly</Frequency>
        <Rate>23. 9900 %</Rate>
        <PaymentAmount>$488.94</PaymentAmount>
        <NextDueDate>03/19/2016</NextDueDate>
        <NextAmountDue>$488.94</NextAmountDue>
        <CurrentBalance>$15,000.00</CurrentBalance>
        <UnpaidLateFees>$0.00</UnpaidLateFees>
        <UnpaidOtherFees>$0.00</UnpaidOtherFees>
    </GetAccountSummary>';
    
    print_r(simplexml_load_string($xml));
    

    给你:

    SimpleXMLElement Object
    (
        [OpenDate] => 02/19/2016
        [LoanAmount] => $15,000.00
        [Tenn] => 48
        [Frequency] => Monthly
        [Rate] => 23. 9900 %
        [PaymentAmount] => $488.94
        [NextDueDate] => 03/19/2016
        [NextAmountDue] => $488.94
        [CurrentBalance] => $15,000.00
        [UnpaidLateFees] => $0.00
        [UnpaidOtherFees] => $0.00
    )
    

    我确定XML_Serializer 类有一个xml-&gt;array 和/或xml-&gt;object,因此您会希望它在该类文件中找到该方法。


    编辑 我注意到您正在将浏览器安全标记回显到您的页面,您需要使用 htmlspecialchars_decode() 对其进行解码:

    $xml = $Serializer->getSerializedData();
    ob_start();
    echo $xml;
    $data = ob_get_contents();
    ob_end_clean();
    
    $order = simplexml_load_string(htmlspecialchars_decode($data));
    echo $order->OpenDate;
    

    【讨论】:

    • 感谢您的回复。我已经做了那个方法,但它是一样的,关于 print_r(simplexml_load_string($xml));它不会像那样显示对象。这就是对象显示的原理:simplexmlement对象([getAccountsummaryResult] => SimplexmlElement对象([ANY] => 02/19/2016 $ 15,000.0048MONTHLY23.9900%$ 48.9403 / 19/19 $ 488.94 $ 15,000.00 $ 0.00 $ 0.00 $ 15,000.00 $ 0.00 $ 0.1.60aactive $ 98.60 $ 0.00 $ 0.002013福特 Fusion2013FordFusion ) )
    • 我认为这就是另一个对象内部有一个对象,但是我如何从那里显示一个值?
    • 你能粘贴那个xml而不是它的图像吗?
    • 你也试过做缓冲选项吗? ob_start(); $xml = $Serializer-&gt;getSerializedData(); echo $xml; $data = ob_get_contents(); ob_end_clean(); print_r(simplexml_load_string($data));
    • 我还会查看 SimpleXMLElement 类的文档,这可能会有所帮助,因为该元素似乎已经是那种对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2019-11-22
    相关资源
    最近更新 更多