সিম্পল এক্সএমলেমেন্ট অবজেক্ট থেকে মান পান


197

আমার এরকম কিছু রয়েছে:

$url = "http://ws.geonames.org/findNearbyPostalCodes?country=pl&placename=";
$url .= rawurlencode($city[$i]);

$xml = simplexml_load_file($url);
echo $url."\n";
$cityCode[] = array(
    'city' => $city[$i], 
    'lat' => $xml->code[0]->lat, 
    'lng' => $xml->code[0]->lng
);

জিওনাম থেকে এক্সএমএল ডাউনলোড করার কথা। আমি যদি পাই তবে print_r($xml):

SimpleXMLElement Object
(
    [code] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [postalcode] => 01-935
                    [name] => Warszawa
                    [countryCode] => PL
                    [lat] => 52.25
                    [lng] => 21.0
                    [adminCode1] => SimpleXMLElement Object
                        (
                        )

                    [adminName1] => Mazowieckie
                    [adminCode2] => SimpleXMLElement Object
                        (
                        )

                    [adminName2] => Warszawa
                    [adminCode3] => SimpleXMLElement Object
                        (
                        )

                    [adminName3] => SimpleXMLElement Object
                        (
                        )

                    [distance] => 0.0
                )

আপনি দেখতে পাচ্ছেন আমি এটি করি $xml->code[0]->latএবং এটি কোনও বস্তু ফেরত দেয়। আমি কীভাবে মূল্য পেতে পারি?



@ কুবাস আপনি একটি উত্তর নির্বাচন করতে পারেন?
kqw

1
2017 আপডেট: এসও আর শীর্ষে সর্বোত্তম উত্তরটি প্রদর্শন করে না। সেরা উত্তর এখানে
রিনোগো

2
@rinogo আপনি সম্ভবত উত্তর ব্লকের শীর্ষে বাছাই করা ট্যাবগুলিতে দুর্ঘটনাক্রমে ক্লিক করেছেন। আপনি যে উত্তরটির সাথে লিঙ্ক করেছেন তার উত্তর ৩৪৫ টি রয়েছে, সুতরাং আপনার যদি "ভোট" বাছাই করা থাকে তবে শীর্ষে দেখায়।
আইএমএসওপি

1
ধন্যবাদ, @ আইএমএসওপি! আপনি ঠিক বলেছেন - আমি অবশ্যই কোনও সময়ে "সক্রিয়" ক্লিক করেছি (পুরানো প্রশ্নের সাথে পুরানো প্রশ্নের জন্য দরকারী, বিটিডব্লিউ) - এটি জানতে পেরে আমার এটিকে "ভোটে" ফেরত দেওয়া দরকার! :)
রিনোগো

উত্তর:


426

আপনাকে স্ট্রিং এ সিম্পল এক্সএমএল অবজেক্টটি কাস্ট করতে হবে।

$value = (string) $xml->code[0]->lat;

9
ডি: আপনি XML বস্তুর json_encode শুধু খেয়াল এবং তারপর json_decode আপনি অলস হচ্ছে & সহজ কাঠামো সাথে কাজ করছি জন্য, সঙ্গে বেশ সুবিধাজনক মোকাবিলা করার জন্য একটি নেস্টেড stdObject পেতে
লুই

1
নির্বোধ প্রশ্ন, কিন্তু এটি কি বাগ নয়? দেখতে php.net/simplexml#95762 কেন আপনি কিছু মাঠে ঢালাই টাইপ করতে হবে না, কিন্তু অন্যদের উপর আছে তোমার কাছে?
gcb

7
এই উত্তরটি এখনও 2016 সালে আরও শক্ত ঠোঁট মারছে!
হিরदेश বিশ্বদেব

4
আমি বিশ্বাস করতে পারি না যে এটি এত জটিল। কেন তারা "getName" নামে একটি ক্লাস তৈরি করবে তবে "getValue" নয়? আপনি যদি এটিকে ম্যানুয়ালি (স্ট্রিং) রুপান্তরিত না করে মুদ্রণ করেন তবে কেন তারা খালি স্ট্রিং মুদ্রণ করবে। কেন ??
ব্যবহারকারী 151496

1
@ user151496 প্রযুক্তিগতভাবে, স্ট্রিং কাস্ট আপনাকে "মান" দিচ্ছে না, তবে "পাঠ্য সামগ্রী" দিচ্ছে। তবে হ্যাঁ, একটি নির্দিষ্ট-নামযুক্ত পদ্ধতিটি আরও আবিষ্কারযোগ্য হবে। একবার আপনি অভ্যস্ত হয়ে গেলে, এটি ব্যবহার করা আসলে কোনও কঠিন নয় ।
আইএমএসওপি

90

আপনি যাদু পদ্ধতিটি __to স্ট্রিং () ব্যবহার করতে পারেন

$xml->code[0]->lat->__toString()

5
অথবা sprintfসঙ্গে %sবিন্যাস। বা echoএবং আউটপুট বাফারিং, বা বা বা ...
হ্যাক্রে

কীভাবে আমি পিএইচপি-তে বস্তুকে এক্সএমএলে রূপান্তর করতে পারি? @ স্প্লেসার্ড
জেম

17

আপনি যদি জানেন যে এক্সএমএল উপাদানটির মান একটি ভাসমান সংখ্যা (অক্ষাংশ, দ্রাঘিমাংশ, দূরত্ব), আপনি ব্যবহার করতে পারেন (float)

$value = (float) $xml->code[0]->lat;

এছাড়াও, (int)পূর্ণসংখ্যার জন্য:

$value = (int) $xml->code[0]->distance;

15

আপনি যদি এক্সএমএল এলিমেন্টের মান জানেন না তবে আপনি ব্যবহার করতে পারেন

$value = (string) $xml->code[0]->lat;

if (ctype_digit($value)) {
    // the value is probably an integer because consists only of digits
}

মানটি একটি সংখ্যা কিনা তা নির্ধারণ করার দরকার হলে এটি কাজ করে, কারণ (string)সর্বদা স্ট্রিং এবং is_int($value)রিটার্ন ফিরে আসবেfalse


বুলিয়ান ছাড়াও চেক করার যে কোনও উপায়: (স্ট্রিং) $ মান == 'সত্য' || (স্ট্রিং) $ মান == 'মিথ্যা'?
তালিসিন

12

আমার পক্ষে অবজেক্টের চেয়ে অ্যারে ব্যবহার করা আরও সহজ,

সুতরাং, আমি একটি এক্সএমএল-অবজেক্ট রূপান্তর করি,

$xml = simplexml_load_file('xml_file.xml');    
$json_string = json_encode($xml);    
$result_array = json_decode($json_string, TRUE);

3
আপনি যদি খুব তাড়াহুড়া না করেন তবে JSON এ রূপান্তর করা এবং তারপরে একই প্রসঙ্গে ফিরে আসা অবিশ্বাস্যভাবে অক্ষম। অবজেক্টের সাথে কাজ করা কঠিন নয় এবং আপনি যদি সত্যই অ্যারেগুলিকে পছন্দ করেন তবে আপনাকে অবশ্যই দেশীয়ভাবে একটি অ্যারেতে রূপান্তর করা উচিত।
উইলিয়াম

লোকেরা কেন এটি করে তা আমি কখনই বুঝতে পারি না - আপনি সরল এক্সএমএল এর সমস্ত বৈশিষ্ট্যগুলি ফেলে দেন, কেবল আপনি $xml['foo'][0]['bar'][0]['@attributes']['baz']পরিবর্তে লিখতে পারেন $xml->foo->bar['baz']
আইএমএসওপি

2

এটি এমন ফাংশন যা আমাকে সর্বদা এক্সএমএল সম্পর্কিত মানগুলিকে অ্যারে রূপান্তর করতে সহায়তা করে

function _xml2array ( $xmlObject, $out = array () ){
    foreach ( (array) $xmlObject as $index => $node )
        $out[$index] = ( is_object ( $node ) ) ? _xml2array ( $node ) : $node;

    return $out;
}

এটি অন্যান্য জিনিসের মধ্যে ফেলে ফেলবে, বা ভেঙে ফেলবে: কোনও বৈশিষ্ট্য, কোনও নেমস্পেসে কিছু, কোনও সিডিএটি ব্লক। সব ঠিক তাই আপনি যে সহজ পদ্ধতিগুলি সরল এক্সএমএল আপনাকে প্রথম স্থানে অফার করেছিল তা হারাতে পারেন।
আইএমএসওপি

1

চেষ্টা current($xml->code[0]->lat)

এটি অ্যারের বর্তমান পয়েন্টারের অধীনে উপাদানটি প্রদান করে যা 0 হয়, সুতরাং আপনি মান পাবেন


1

আপনি নিজের সম্পত্তি অ্যাক্সেস করতে '{}' ব্যবহার করতে পারেন, এবং তারপরে আপনি নিজের ইচ্ছামত করতে পারেন। এটি সংরক্ষণ করুন বা সামগ্রীটি প্রদর্শন করুন।

    $varName = $xml->{'key'};

আপনার উদাহরণ থেকে তার কোড

        $filePath = __DIR__ . 'Your path ';
        $fileName = 'YourFilename.xml';

        if (file_exists($filePath . $fileName)) {
            $xml = simplexml_load_file($filePath . $fileName);
            $mainNode = $xml->{'code'};

            $cityArray = array();

            foreach ($mainNode as $key => $data)        {
               $cityArray[..] = $mainNode[$key]['cityCode'];
               ....

            }     

        }

3
সেখানে {}হাইফেনের মতো বিশেষ অক্ষর না থাকলে ব্যবহার করার দরকার নেই। $xml->{'key'}লেখার এক কুশল উপায় মাত্র $xml->key
আইএমএসওপি

0
header("Content-Type: text/html; charset=utf8");
$url  = simplexml_load_file("http://URI.com");

 foreach ($url->PRODUCT as $product) {  
    foreach($urun->attributes() as $k => $v) {
        echo $k." : ".$v.' <br />';
    }
    echo '<hr/>';
}

2
এই উত্তরের কোনও ব্যাখ্যা নেই, এবং তাই মূল অন্তর্দৃষ্টিটি মিস করেছে যা হ'ল ঠিক যেমন একটি বস্তুর পরিবর্তে স্ট্রিং হয়ে উঠতে echoবাধ্য $vকরে (string)$v
আইএমএসওপি

0

আপনি এই ফাংশন দিয়ে অ্যারে রূপান্তর করতে পারেন

function xml2array($xml){
$arr = array();

foreach ($xml->children() as $r)
{
    $t = array();
    if(count($r->children()) == 0)
    {
        $arr[$r->getName()] = strval($r);
    }
    else
    {
        $arr[$r->getName()][] = xml2array($r);
    }
}
return $arr;
}

আপনি পারেন, তবে আপনি কেন চান?
আইএমএসওপি

কারণ সূচকটি যদি একটি নম্বর হয় তবে এটি সমস্যা হতে পারে। এই $ পরিবর্তনশীল-> কোড-> 0 টি পছন্দ? সিম্পল এক্সএমলেমেন্ট অবজেক্ট ([কোড] => অ্যারে ([0] => সিম্পল এক্সএমলেমেন্ট অবজেক্ট (...
নিক্সিস

<0>কোনও বৈধ এক্সএমএল ট্যাগ নয়, যাতে এটি কখনই ঘটে না। কয়েকটি বৈধ এক্সএমএল নাম বৈধ পিএইচপি নামগুলির মতো নয় <foo-bar>, তবে এটি ->{'foo-bar'}সিনট্যাক্সের সাহায্যে পরিচালনা করা যায় । অথবা আপনার অর্থ কি 0অনুরূপ নামযুক্ত উপাদানের তালিকায় থিম উপাদানটি অ্যাক্সেস করা উচিত ? ঠিক আছে $parent->childName[0]
আইএমএসওপি

0
$codeZero = null;
foreach ($xml->code->children() as $child) {
   $codeZero = $child;
}

$lat = null;
foreach ($codeZero->children() as $child) {
   if (isset($child->lat)) {
      $lat = $child->lat;
   }
}

এই কোড স্নিপেটটি কী দেখানোর চেষ্টা করছে তা আমি নিশ্চিত নই, তবে দেখে মনে হচ্ছে এটি রচনার খুব জটিল (এবং ভুল) উপায় $codeZero = $xml->code[0]এবং$lat = $xml->code[0]->lat
IMSoP

@ আইএমএসওপি, আপনি কোডটি না দিয়েও এই ভোট দিয়ে যাচ্ছেন? এটি কাজ না করলে আমি পোস্ট করতাম না। আপনার পরামর্শটি কোনও ভবিষ্যতের জন্য অনুমতি দেয় না, যা লুপের জন্য সাধারণের চেয়ে পরিষ্কার। আমি আর সমস্ত বিবরণ মনে রাখি না, তবে অন্যান্য সমাধানগুলি যখন না দেয় তখন এটি কাজ করে।
craned

আমি বেশিরভাগ ক্ষেত্রেই ভোট দিয়েছি কারণ এটি কী করছে তার কোনও ব্যাখ্যা নেই। আপনি যখন এটি আবার পড়েন তখনও যদি আপনি এটি বুঝতে না পারেন তবে এটি অন্য কারও পক্ষে কীভাবে কার্যকর হবে বলে মনে করা হচ্ছে? ভবিষ্যদ্বাণী ব্যবহারের ক্ষেত্রে নিশ্চিতভাবেই আপনি যা করতে পারেন: foreach ( $xml->code as $code ) { $lat = (string)$code->lat; echo $lat; }তবে আপনি এখানে যা লুপ করছেন তা হ'ল "প্রথম <code>উপাদানটির সমস্ত শিশু "; যা আমার কাছে খুব একটা বোঝায় না। নির্মল করার জন্য, $xml->code->children()জন্য সাধারণভাবে সংক্ষেপে হয় $xml->code[0]->children()না "সন্তান বলে অভিহিত code"।
IMSoP

@ আইএমএসওপি, আচ্ছা, এটি একটি উপযুক্ত বিষয় point আমার একটা ব্যাখ্যা দেওয়া উচিত ছিল; এটি সম্ভবত আমার কাছে এতটা স্পষ্ট মনে হয়েছিল যে এটি আমার কাছে ঘটেনি। যাইহোক, আমার পক্ষে, কমপক্ষে, এই বিষয়টি হ'ল যে এই পৃষ্ঠায় যিনি রয়েছেন তিনি ইতিমধ্যে প্রসঙ্গটি জানেন এবং তার ব্যাখ্যা প্রয়োজন হবে না কারণ তারা ইতিমধ্যে জানেন যে কী ঘটছে। এটি ইতিমধ্যে প্রমাণিত যে একজন ব্যক্তি ইতিমধ্যে আমার উত্তরটিকে ভোট দিয়েছিল বা আমি এখন নেতিবাচক আছি। আমি ভবিষ্যতে একটি ব্যাখ্যা পোস্ট করতে আরও ভাল করব।
craned

এছাড়াও, আমি প্রায় আপনাকে গ্যারান্টি দিতে পারি যে আমি প্রথমে আপনার পরামর্শটি চেষ্টা করেছি এবং এটি কার্যকর হয়নি তাই আমাকে অন্য একটি সন্ধান করতে হয়েছিল।
craned

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.