SimpleXMLElement ऑब्जेक्ट से मूल्य प्राप्त करें


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

इसे जियोम से XML डाउनलोड करना है। अगर मुझे 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और यह एक वस्तु देता है। मैं मूल्य कैसे प्राप्त कर सकता हूं?



@kubas क्या आप एक उत्तर चुन सकते हैं?
18

1
2017 अपडेट: SO अब शीर्ष पर सबसे अच्छा उत्तर प्रदर्शित नहीं करता है। सबसे अच्छा जवाब यहाँ है
रिनोगो

2
@rinogo आपने संभवतः गलती से उत्तर ब्लॉक के शीर्ष पर सॉर्टिंग टैब में से एक पर क्लिक किया है। आपके द्वारा जोड़े गए उत्तर में 345 वोट हैं, इसलिए यदि आप "वोट" के लिए सेट कर रहे हैं तो सबसे ऊपर दिखाता है।
IMSoP

1
धन्यवाद, @IMSoP! आप सही हैं - मैंने कुछ बिंदु पर "सक्रिय" पर क्लिक किया होगा (पुराने उत्तरों के साथ पुराने प्रश्नों के लिए उपयोगी, btw) - यह जानने के लिए अच्छा है कि मुझे इसे "वोट" में बदलने की आवश्यकता है! :)
rinogo

जवाबों:


427

आपको simpleXML ऑब्जेक्ट को एक स्ट्रिंग में डालना होगा।

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

9
बस अगर आपने xml ऑब्जेक्ट को json_encode किया है और फिर json_decode किया है, तो इससे निपटने के लिए आपको एक नेस्टेड stdObject मिलता है, जब आप आलसी हो रहे हैं और सरल संरचनाओं के साथ काम कर रहे हैं, तो इसके लिए बहुत आसान है: D
Louis

1
मूर्खतापूर्ण सवाल है, लेकिन यह एक बग नहीं है? देखें php.net/simplexml#95762 आपको कुछ क्षेत्रों पर टाइप करने की आवश्यकता क्यों नहीं है, लेकिन दूसरों पर आपको क्या करना है?
gcb

7
यह उत्तर अभी भी 2016 में और भी कठिन चूतड़ मार रहा है!
हृदेश विश्वेदेवा

4
मैं विश्वास नहीं कर सकता यह इतना जटिल है। वे "getName" नहीं बल्कि "getValue" नामक एक वर्ग क्यों बनाएंगे? यदि आप इसे मैन्युअल रूप से (स्ट्रिंग) में परिवर्तित करने के बजाय मुद्रित करते हैं तो वे खाली स्ट्रिंग क्यों मुद्रित करेंगे। क्यों??
user151496

1
@ user151496 तकनीकी रूप से, स्ट्रिंग कास्ट आपको "मूल्य" नहीं दे रहा है, लेकिन "पाठ सामग्री"। लेकिन हां, एक विशेष रूप से नामित विधि अधिक खोज योग्य होगी। एक बार जब आप इस के लिए अभ्यस्त हो जाते हैं, हालांकि, यह वास्तव में उपयोग करने के लिए कोई कठिन नहीं है ।
IMSoP

91

आप मैजिक विधि का उपयोग भी कर सकते हैं __toString ()

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

5
या प्रारूप के sprintfसाथ %s। या या echoआउटपुट बफ़रिंग, या या या ...
हैक्रे

मैं PHP में XML को ऑब्जेक्ट कैसे बदल सकता हूं? @sglessard
Gem

17

यदि आप जानते हैं कि XML तत्व का मान एक फ्लोट संख्या (अक्षांश, देशांतर, दूरी) है, तो आप उपयोग कर सकते हैं (float)

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

इसके अलावा, (int)पूर्णांक संख्या के लिए:

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

15

यदि आप XML तत्व का मूल्य नहीं जानते हैं, तो आप उपयोग कर सकते हैं

$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- वस्तु में परिवर्तित करता हूं,

$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']
IMSoP

2

यह वह फ़ंक्शन है जिसने हमेशा xml संबंधित मानों को सरणी में बदलने में मेरी मदद की है

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

    return $out;
}

यह अन्य चीजों के अलावा, किसी भी गुण, किसी भी नाम स्थान में, किसी भी CDATA ब्लॉक को फेंक देगा, या तोड़ देगा। बस इतना है कि आप उन सुविधा विधियों को खो सकते हैं जो SimpleXML ने आपको पहली जगह में पेश किया था।
IMSoP

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
IMSoP

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चाहेंगे।
IMSoP

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;
}

आप कर सकते हैं, लेकिन आप क्यों करना चाहेंगे?
IMSoP

क्योंकि अगर इंडेक्स एक संख्या है, तो यह एक समस्या हो सकती है। इस $ चर की तरह-> कोड-> 0? SimpleXMLElement ऑब्जेक्ट ([कोड] =>
एरियर

<0>एक वैध XML टैग नहीं है, इसलिए ऐसा कभी नहीं होगा। कुछ मान्य XML नाम, मान्य PHP नाम नहीं हैं, जैसे <foo-bar>, लेकिन इसे ->{'foo-bar'}सिंटैक्स के साथ संभाला जा सकता है । या आप सिर्फ 0इसी नाम के तत्वों की सूची में वें तत्व तक पहुँचने का मतलब है ? वह बस है $parent->childName[0]
IMSoP

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

@IMSoP, आप इस कोड को आज़माए बिना भी मतदान कर रहे हैं? अगर यह काम नहीं करता तो मैंने इसे पोस्ट नहीं किया होता। आप सुझाव दे रहे हैं कि आप फॉर्च्यूनर की अनुमति न दें, जो लूप के लिए साधारण से साफ है। मुझे अब सभी विवरण याद नहीं हैं, लेकिन यह तब काम किया जब अन्य समाधान नहीं थे।
craned

मैंने ज्यादातर मतदान किया क्योंकि इसका कोई स्पष्टीकरण नहीं है कि यह क्या कर रहा है। अगर आप इसे पढ़ते समय भी इसे नहीं समझ पाते हैं, तो इसे किसी और के लिए कैसे उपयोगी माना जाता है? फ़ॉरच का उपयोग करने के लिए, सुनिश्चित करें कि आप कर सकते हैं: foreach ( $xml->code as $code ) { $lat = (string)$code->lat; echo $lat; }लेकिन आप यहाँ पर जो लूपिंग कर रहे हैं वह "पहले <code>तत्व के सभी बच्चे " हैं; जो मेरे लिए बहुत मायने नहीं रखता है। स्पष्ट करने के $xml->code->children()लिए $xml->code[0]->children(), "बच्चों को बुलाया code" नहीं, के लिए आशुलिपि है ।
IMSoP

@IMSoP, खैर, यह एक उचित बिंदु है। मुझे स्पष्टीकरण देना चाहिए था; यह शायद मुझे उस समय इतना स्पष्ट लग रहा था कि यह मेरे साथ नहीं हुआ था। हालांकि, मेरे पक्ष में, कम से कम, यह तथ्य है कि जो कोई भी इस पृष्ठ पर है, वह पहले से ही संदर्भ जानता है और उसे स्पष्टीकरण की आवश्यकता नहीं होगी क्योंकि वे पहले से ही जानते हैं कि क्या हो रहा है। यह इस तथ्य से साबित होता है कि एक व्यक्ति ने पहले से ही मेरे जवाब को वोट दिया था या मैं अब नकारात्मक में हूं। मैं भविष्य में स्पष्टीकरण पोस्ट करने में बेहतर करूंगा।
क्रैंक किया गया

इसके अलावा, मैं लगभग गारंटी दे सकता हूं कि मैंने पहले आपके सुझाव की कोशिश की होगी, और यह काम नहीं किया इसलिए मुझे दूसरा ढूंढना पड़ा।
craned

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.