2014-07-21 6 views
5

मैं एक साबुन अनुरोध में कुछ विशेषताओं को जोड़ने की कोशिश कर रहा हूं। PHP.net पर शीर्ष रेटेड टिप्पणी (http://php.net/manual/en/soapvar.soapvar.php) और here और here अतः सभी पर एक ही बात कहते हैं:php SoapVar विशेषताएँ सेट नहीं कर रहा

$param = array(
    "_" => 'value', 
    'attrName' => 'attributeName' 
); 
$p = new SoapVar($param, SOAP_ENC_OBJECT); 

लौटना चाहिए

<param attrName="attributeName">value</param> 

कौन सा बहुत अच्छा होगा, को छोड़कर जब मैं की है कि ब्लॉक चलाने कोड, मुझे यह एक्सएमएल मिलता है:

<param> 
    <_>value</_> 
    <attrName>attributeName</attrName> 
</param> 

जो स्पष्ट रूप से गलत है। निश्चित रूप से मैं इस समस्या के लिए दुनिया में एकमात्र व्यक्ति नहीं हूं? क्या 2011 के बाद से कार्यक्षमता की उस छोटी सी कार्यक्षमता में बदलाव आया?

उत्तर

0

इस पल के लिए मैं नोड बनाने के लिए DOMDocument ऑब्जेक्ट का उपयोग कर रहा हूं। इच्छा है कि एक आसान तरीका था, लेकिन इस सवाल का जवाब देने और कामकाज प्रदान करने के हित में, यहां जाता है:

$dom = new DOMDocument("1.0", "utf-8"); 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 
$param = $dom->createElement('param'); 
$paramAttr = $dom->createAttribute('attrName'); 
$paramAttr->value = "attributeName"; 
$param->value = "value"; 
$param->appendChild($paramAttr); 
$dom->appendChild($param); 
$soap->param = new SoapVar($dom->saveXML($dom->documentElement), XSD_ANYXML); 

तो आदर्श नहीं है। एक अन्य तरीका यह करने के लिए एक्सएमएल खुद लिखने के लिए होगा:

$soap->param = new SoapVar("<param attrName='attributeName'>value</param>", XSD_ANYXML); 

मैं किसी भी तरह से पसंद नहीं है, लेकिन जब आप एक समय सीमा है, तो आप क्या काम करता है के साथ जाना।

0

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं इस पोस्ट पर किसी और के लिए उत्तर देना चाहता था। मैं माउंट के समान मुद्दे में भाग गया और एक समाधान का उपयोग करके इसके आसपास काम करने में सक्षम था जिसके लिए XSD_ANYXML की आवश्यकता नहीं है। मैं SoapVar को array दृष्टिकोण के साथ प्राप्त करने में असमर्थ था, लेकिन कक्षा गुणों के समान कुंजी का उपयोग करके इसे काम करने में सक्षम था। उदाहरण के लिए, नीचे दिए गए कोड का उपयोग कर:

class MyParam { 
    public $_; 
    public $attrName; 

    public function __construct($paramValue, $attrValue) 
    { 
    $this->_ = $paramValue; 
    $this->attrName = $attrValue; 
    } 
} 

$soap->param = new MyParam("value", "attributeName"); 

मैं केवल wsdl2phpgenerator लाइब्रेरी का उपयोग कर एक डबल्यूएसडीएल विशेषताओं की आवश्यकता होगी, डेटा प्रकार युक्त से पीएचपी वर्गों उत्पन्न करने के लिए के बाद यह पता लगाने में सक्षम था और इस पैटर्न इस्तेमाल किया जा रहा देखा।

+0

जैसा कि व्लादिमीर ऊपर बताया गया है, यह केवल डब्लूएसडीएल मोड में काम करेगा! – jfx

2

हां, आप अकेले नहीं हैं जिनके पास यह समस्या है - मैंने अनगिनत पदों को देखा है जहां लोग दावा करते हैं कि SOAP_ENC_OBJECT के साथ सोपवार को पारित सरणी इस मुद्दे को हल करती है जबकि अन्य लोग अन्य पदों पर अन्यथा दावा करते हैं। और कारणों पर दस्तावेज स्पष्ट नहीं है (मेरे पोस्ट साल पहले php.net के टिप्पणी अनुभाग में)।

एक ही समस्या का सामना करना मैंने PHP SOAP एक्सटेंशन के स्रोतों को पढ़ा है। मूल रूप से वाक्य रचना आप का इस्तेमाल किया है बिल्कुल सही है:

$param = array(
    "_" => 'value', 
    'attrName' => 'attributeName' 
); 
$p = new SoapVar($param, SOAP_ENC_OBJECT); 

क्या प्रलेखन नहीं कहना है: इस वाक्य का उत्पादन हो सकता दो अलग परिणाम (और वास्तव में और भी अधिक: PHP सोप यह आठ अलग अलग तरीकों से व्यक्त कर सकते हैं)। और जैसा कि आप उपरोक्त कोड देख सकते हैं अस्पष्ट है: ऊपर दिए गए कोड में क्या कहा गया है कि 'attrName' एक विशेषता है और तत्व नहीं है? कुछ भी तो नहीं। ऊपर दिए गए कोड में सोप क्लाइंट के लिए पर्याप्त मात्रा में जानकारी नहीं है कि यह तय करने के लिए कि 'attrName' क्या है और इसलिए यह "तत्व" पर डिफ़ॉल्ट है।

सोप क्लाइंट दो मोड में संचालित हो सकता है: गैर-डब्लूएसडीएल और डब्लूएसडीएल। पूर्व मोड में आपको कभी भी नतीजा नहीं मिलेगा: सोप क्लाइंट एरे तत्व को विशेषता में बदलने के लिए प्रकार की जानकारी पर निर्भर करता है। चूंकि टाइप जानकारी गैर-डब्लूएसडीएल मोड में मौजूद नहीं है, सोप क्लाइंट तत्वों के सेट के रूप में प्रदान की गई सरणी का प्रतिनिधित्व करता है - बिल्कुल आपको जो मिला।WSDL मोड प्रकार की जानकारी मौजूद है और इसलिए सोप क्लाइंट तत्वों और विशेषताओं के नामों को जानता है और उन्हें सरणी अनुक्रमणिका में मिलान कर सकता है। यदि आप अपने गुण चाहते हैं तो आपके पास डब्ल्यूएसडीएल मोड में आपका सोप क्लाइंट होना चाहिए।

मूल रूप से आदेश प्राप्त करने के लिए क्या आप चाहते हैं आप के साथ < XSD दस्तावेज़/शाब्दिक मोड में WSDL फ़ाइल की आवश्यकता है में: < XSD में: "स्ट्रिंग XSD" /> उचित अनुभाग में: विशेषता नाम = "attrName" प्रकार = स्कीमा > ब्लॉक।

कुछ लोग गुणों के लिए सरणी उपयोग के बारे में सफलता का दावा करते हैं और अन्य लोगों का कहना है कि "यह काम नहीं करता है" पूरी तरह से उनके सेटअप में निहित है: कुछ लोगों के पास डब्लूएसडीएल फाइलें उपभोग करने के लिए हैं, कुछ लोग सिर्फ नए साबुन क्लाइंट (शून्य , सरणी (...)); (जो निश्चित रूप से उनकी अपेक्षाओं में विफल रहता है)

+0

महान बिंदु, बस इसे जोड़ने के लिए वस्तुओं के लिए भी काम करता है, बस संपत्ति जोड़ें और यह * स्वचालित रूप से * wsdl के अनुसार विशेषता के लिए मैप किया जाएगा। साफ सुविधा - इस प्रकार आप केवल ऑब्जेक्ट स्ट्रक्चर का उपयोग कर सकते हैं और उन्हें स्वचालित रूप से नोड्स/विशेषताओं में मैप किया गया है। – jfx

संबंधित मुद्दे