2009-02-09 4 views
12

का उपयोग कर कोको में एक तत्व का मूल्य प्राप्त करना मैं वास्तविक आईफोन पर एनएसएक्सएमएल की दी गई सीमाओं के कारण TouchXml का उपयोग कर रहा हूं। वैसे भी, मैं सिर्फ ऑब्जेक्टिव-सी के साथ शुरू कर रहा हूँ, मैं एक सी # पृष्ठभूमि से आते हैं, और कुछ new..anyhow .. यहाँ मेरी xml फ़ाइल है सीखने की तरह महसूस किया ...टचएक्सएमएल

<?xml version="1.0" encoding="utf-8"?> 
<FundInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/webservices"> 
    <FundsReleaseDate>2009-02-11T00:00:00</FundsReleaseDate> 
    <FundValue>7800</FundValue> 
    <FundShares>1000</FundShares> 
</FundInfo> 

मैं कोशिश कर रहा हूँ 7800, यानी FundValue पाने के लिए। किसी को सही दिशा में मुझे इंगित कर सकते हैं, मैं TouchXml CXMLDocument उपयोग कर रहा हूँ और myParser प्रकार CXMLDocument की है, मैं कोशिश की है

NSArray *nodes = [myParser nodesForXPath:@"//FundInfo" error:&err]; 

मूल रूप से नोड के लिए नहीं के बराबर

if ([nodes count] > 0) { 
    amount = [nodes objectAtIndex:1]; 
} 

अद्यतन 1 का मूल्यांकन करता है: मैं त्याग दिया है XPath का उपयोग करके पार्सिंग, और इसे NSURLRequest के साथ बदल दिया है, इसलिए अब मेरे पास एक स्ट्रिंग में संपूर्ण एक्सएमएल है, लेकिन उद्देश्य-सी के लिए मेरा कठोर परिचय जारी है ... मुझे अभी एहसास हुआ कि मैं .NET BCL में कितना खराब हो गया हूं, जहां चीजें रेगेक्स इतनी आसानी से उपलब्ध हैं।

अद्यतन 2: मुझे पता चला है कि RegexKitLite को regex के लिए कैसे उपयोग करें।

तो सवाल अब है, मैं फंडवैल्यू के अंदर से "7800" कैसे प्राप्त करूं जो अब एक बड़ी स्ट्रिंग है। मैंने पुष्टि की है कि मेरे पास एनएसएलओजी का उपयोग करके इसे लिखकर मेरे एनएसएसटींग में है।

उत्तर

25

प्रयास करें समस्या आपके XML एक नाम स्थान है, जो अपने XPath वास्तव में मेल नहीं खाता का मतलब होता है। दुर्भाग्य से कोई डिफ़ॉल्ट मैपिंग नहीं है, और XPath वास्तव में इसे आंतरिक रूप से संभालने के लिए एक अच्छा तरीका परिभाषित नहीं करता है, इसलिए आप XPath को बदलकर इसे ठीक नहीं कर सकते हैं। इसके बजाय आपको दुभाषिया को सूचित करने की आवश्यकता है कि आप इसे अपने XPath में कैसे मैप करना चाहते हैं।

ऐसा लगता है कि TouchXML के माध्यम से इस के लिए समर्थन को लागू करता है जैसे:

NSDictionary *mappings = [NSDictionary dictionaryWithObject:@"http://tempuri.org/webservices" forKey:@"tempuri"]; 
[myParser nodesForXPath:@"//tempuri:FundInfo" namespaceMappings:mappings error:&err]; 
+0

धन्यवाद, मैं निम्न अपवाद संदेश के साथ एक दुर्घटना हो रही है:।। [CXMLElement isEqualToString :]: अज्ञात चयनकर्ता उदाहरण – kd7

+0

पर भेजा गया है, मुझे यकीन है कि यह सब इस तथ्य से जुड़ा हुआ है कि जिस वेब सेवा की मैं कोशिश कर रहा हूं ओ उपभोग है .NET आधारित है, लेकिन दुर्भाग्य से मेरा कोई नियंत्रण नहीं है, मैंने चारों ओर गुमराह किया है और ऐसा लगता है कि xmlns विशेषता सभी समस्याओं का कारण है। – kd7

+0

मैं किसी भी प्रोजेक्ट में TouchXML का उपयोग नहीं करता, हालांकि मैं libxml2 का उपयोग करता हूं (जो टचएक्सएमएल एक रैपर है), इसलिए अंतर्निहित लाइब्रेरी काम करती है। यह मुझे सदमे नहीं देगा अगर यह एक अच्छी तरह से परीक्षण कोड पथ नहीं है, तो आपको TouchXML में कुछ ठीक करने की आवश्यकता हो सकती है। –

-1

NSArray *nodes = [myParser nodesForXPath:@"/FundInfo/*" error:&err]; 
+0

जवाब ऊपर कहते हैं, आप 'namespaceMapping' जरूरत है उत्तर के लिए –

0

मैं एक ऐसी ही समस्या थी:

- (NSArray *)nodesForXPath:(NSString *)xpath namespaceMappings:(NSDictionary *)inNamespaceMappings error:(NSError **)error; 

तो तुम जैसे कुछ कोशिश कर सकते हैं। एक एक्सएमएल पर कोई भी चयन जिसमें नामस्थान निर्दिष्ट है (xmlns = "http: // somenamespace") परिणामस्वरूप कोई नोड्स नहीं मिलेगा। बहुत अजीब विचार यह है कि यह अतिरिक्त नामस्थान प्रारूपों का समर्थन करता है जैसे xmlns: somenamespace = "http: // somenamespace"।

किसी भी मामले में, दूर कर रहा है क्या करने के लिए सबसे आसान काम से एक तार की जगह और कोई रिक्त स्ट्रिंग के साथ बदलें xmlns = "http://tempuri.org/webservices।

कुल मिलाकर मैं touchxml पसंद है, लेकिन मेरा मानना ​​है कि नहीं कर सकते इस बग अभी भी मौजूद है