SimpleXML से @attribute पर पहुँचना


120

मुझे @attributeअपने SimpleXML ऑब्जेक्ट के अनुभाग तक पहुंचने में समस्या हो रही है । जब मैं var_dumpसंपूर्ण ऑब्जेक्ट, मुझे सही आउटपुट मिलता है, और जब मैं var_dumpबाकी ऑब्जेक्ट (नेस्टेड टैग) प्राप्त करता हूं, तो मुझे सही आउटपुट मिलता है, लेकिन जब मैं डॉक्स का पालन करता var_dump $xml->OFFICE->{'@attributes'}हूं और , मुझे इस तथ्य के बावजूद एक खाली ऑब्जेक्ट मिलता है, सबसे पहलाvar_dump स्पष्ट रूप से दिखाता है कि आउटपुट के लिए विशेषताएँ हैं।

किसी को पता है कि मैं यहां क्या गलत कर रहा हूं / मैं यह काम कैसे कर सकता हूं?


5
var_dump () भ्रामक है, जब यह SimpleXML की बात आती है। इसका आउटपुट शाब्दिक रूप से न लें। इसके अलावा, आप ऐरे एक्सेस का उपयोग करके विशेषताओं तक नहीं पहुँच सकते? जैसे $ xml-> कार्यालय ['MyAttribute']?
फ्रैंक किसान

अगर आप ['@attributes' का उपयोग करना चाहते हैं, तो आपको SimpleXMLElement को पहले डालना होगा
Enrique

जवाबों:


88

आप XML नोड पर विशेषताएँ () फ़ंक्शन को कॉल करके एक XML तत्व की विशेषताएं प्राप्त कर सकते हैं। फिर आप फ़ंक्शन का रिटर्न मान var_dump कर सकते हैं।

अधिक जानकारी के लिए php.net http://php.net/simplexmlelement.attributes

उस पृष्ठ से उदाहरण कोड:

$xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $b) {
    echo $a,'="',$b,"\"\n";
}

7
दिलचस्प है, $bएक SimpleXMLElementवस्तु होगी print_rऔर var_dumpआपको अजीब चीजें देगा। आप इसे प्राप्त करने के लिए इसे एक स्ट्रिंग के रूप में (या जो कुछ भी आप पसंद करते हैं) डाल सकते हैं।
jxmallett

Do ""। $ B इसे स्ट्रिंग के रूप में रखने के लिए
dr_rk

135

इसे इस्तेमाल करे

$xml->attributes()->Token

2
इसका जवाब @Artefacto ने पहले ही दे दिया है
हक्रे

45
हां, लेकिन कठिन रूप में
zysoft

2
हां, यह सबसे सुरुचिपूर्ण समाधान है।
ईसाई

मैंने यह कोशिश की है, और मुझे लगता है कि पेज क्रैश हो रहा है। नीचे बोरा लगता है कि यह एक गलत प्रारूप है, जिसे मैं इस समय से सहमत हूँ .. हालाँकि मैंने यह (आपका) प्रारूप कई बार उल्लेख किया है। क्या कुछ बारीकियाँ मुझे याद आ रही हैं
गेरार्ड ओनली

2
@Gardardoneill, मुझे समझ में नहीं आता है कि क्यों बोरा कहते हैं कि यह विशेषताओं तक पहुंचने का गलत तरीका है, यह बहुत सही काम करता है। आपको जो याद आ रहा है वह यह है कि आपको attributes()अपने XML में सही टैग के अनुरूप वस्तु पर कॉल करने की आवश्यकता है । जैसे अगर आपके पास है <root><tag attr="a">b</tag></root>तो आपको $xml->tag->attributes()->attrइसे एक्सेस करने के लिए क्या करना होगा।
22

55

मैं @attributesनीचे की तरह पाने के लिए कई बार पहले इस्तेमाल करता था और यह थोड़ा लंबा था।

$att = $xml->attributes();
echo $att['field'];

यह और अधिक आसान होना चाहिए और आप केवल एक ही बार में प्रारूपण के बाद गुण प्राप्त कर सकते हैं:

मानक तरीका - ऐरे-एक्सेस विशेषताएँ (AAA)

$xml['field'];

अन्य विकल्प हैं:

सही और त्वरित प्रारूप

$xml->attributes()->{'field'};

गलत प्रारूप

$xml->attributes()->field;
$xml->{"@attributes"}->field;
$xml->attributes('field');
$xml->attributes()['field'];
$xml->attributes->['field'];

1
मैं आपके पहले गलत स्वरूपों से सहमत हूँ क्योंकि मुझे पेज क्रैश हो रहा है - हालाँकि कई लोग इस काम का दावा कर रहे हैं। इस बारे में कोई स्पष्टीकरण या बारीकियां?
जेरार्ड ओनली

1
"गलत प्रारूप" काम करते हैं। मैं हमेशा पहले उदाहरण का उपयोग करता हूं। यह गलत क्यों है?
ग्रेजगोरज

3
तकनीकी तौर पर, $xml->attributes()->{'field'}, $xml->attributes()->field, और $f='field'; $xml->attributes()->$f;एक ही हैं। बिना किसी कारण के एक सही प्रारूप देखें और दूसरा गलत।
zysoft

$ xml-> विशेषताएँ () -> {'फ़ील्ड'} सही है क्योंकि विशेषता नाम (अर्थात "डेटा-एटार") में विशेष वर्णों के साथ उपयोग करना सुरक्षित है। $ xml-> विशेषताएँ () -> फ़ील्ड केवल उन विशेषताओं के लिए काम करती है जो एकल अल्फ़ान्यूमेरिक शब्द हैं
vzr

दोनों सही विकल्पों का उपयोग करते समय SimpleXMLElement प्राप्त करना।
डेरियस .V

41
$xml = <<<XML
<root>
<elem attrib="value" />
</root>
XML;

$sxml = simplexml_load_string($xml);
$attrs = $sxml->elem->attributes();
echo $attrs["attrib"]; //or just $sxml->elem["attrib"]

का उपयोग करें SimpleXMLElement::attributes

सत्य है, SimpleXMLElement get_propertiesहैंडलर बड़ा समय निहित है। "@Attributes" नाम की कोई संपत्ति नहीं है, इसलिए आप ऐसा नहीं कर सकते $sxml->elem->{"@attributes"}["attrib"]


इस विचित्र तरीके ( हैंडलर) में SimpleXML क्यों व्यवहार करता है, यह समझाने के लिए धन्यवाद get_properties। बहुत ही रोचक।
andttweber

मान के बजाय ऐसा करते समय SimpleXMLElement प्राप्त करना
Darius.V


8

यदि आप इन विशेषताओं की सूची की तलाश कर रहे हैं, तो XPath आपका मित्र होगा

print_r($xml->xpath('@token'));

3

इसने मुझे simplexml_load_file ($ फ़ाइल) के परिणाम को JSON संरचना में बदलने और इसे डिकोड करने में मदद की:

$xml = simplexml_load_file("$token.xml");
$json = json_encode($xml);
$xml_fixed = json_decode($json);

$try1 = $xml->structure->{"@attributes"}['value'];
print_r($try1);

>> result: SimpleXMLElement Object
(
)

$try2 = $xml_fixed->structure->{"@attributes"}['value'];
print_r($try2);

>> result: stdClass Object
(
    [key] => value
)

2

दुर्भाग्य से मेरे पास PHP 5.5 का एक अनूठा बिल्ड (जेंटू के साथ अटका हुआ) है, और मुझे जो मिला वह था

 $xml->tagName['attribute']

एकमात्र समाधान था जिसने काम किया। मैंने ऊपर बोरा के सभी तरीकों की कोशिश की, जिसमें 'राइट एंड क्विक' प्रारूप भी शामिल है, और वे सभी विफल रहे।

तथ्य यह है कि यह सबसे आसान प्रारूप है, एक प्लस है, लेकिन यह सोचकर मुझे मजा नहीं आया कि मैं उन सभी प्रारूपों की कोशिश कर रहा था, जिन्हें अन्य लोग काम कर रहे थे।

इसके लायक क्या है (क्या मैंने अद्वितीय निर्माण का उल्लेख किया है?) के लिए एनओजी।


मैं आमतौर पर उनके हिस्से के तत्व के समान नामस्थान में विशेषताओं के लिए विशेषताओं के लिए सरणी संकेतन का उपयोग करने की सलाह दूंगा। मैं कहूंगा कि यह सबसे आसान प्रारूप है (जैसा कि आप इसे कहते हैं) एक कारण से। एक नामित कुंजी के साथ सरणी-पहुंच = सिंप्लेक्स तत्व के साथ विशेषता।
हक्रे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.