الحصول على قيمة عنصر في الكاكاو باستخدام TouchXML

StackOverflow https://stackoverflow.com/questions/526887

  •  22-08-2019
  •  | 
  •  

سؤال

وأستخدمه TouchXml بسبب قيود معينة من NSXML على اي فون الفعلي. على أي حال، أنا بدأت للتو مع الهدف-C، لقد جئت من خلفية C #، وشعرت تعلم شيء 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];
}

وUPDATE 1: لقد تخلى التوزيع باستخدام كسباث، وحلت محل ذلك مع NSURLRequest، وحتى الآن لدي XML بأكمله في سلسلة، ولكن عرضي وقحا للهدف-C لا يزال ... أنا أدرك مدى مدلل لدي أصبح لBCL. NET حيث هي أشياء مثل التعبيرات المنتظمة حتى متاحة بسهولة.

وUPDATE2: لقد برزت كيفية استخدام RegexKitLite عن التعابير المنطقية.

ولذا فإن السؤال الآن هو: كيف يمكنني الحصول على "7800" من داخل FundValue الذي هو الآن واحد من سلسلة كبيرة. لقد أكد لي في بلدي NSString عن طريق الكتابة باستخدام NSLog.

هل كانت مفيدة؟

المحلول

والمشكلة هي أن XML لديه مساحة الاسم، وهو ما يعني كسباث الخاص بك لا يتطابق مع الواقع. للأسف لا توجد التعيين الافتراضي، و XPath لا يعرف في الواقع وسيلة جيدة للتعامل مع هذا داخليا، لذلك لا يمكن إصلاحه ببساطة عن طريق تغيير كسباث. بدلا من ذلك تحتاج إلى إبلاغ مترجم كيف تريد تعيين في كسباث الخاص بك.

ويبدو TouchXML تنفذ دعم لهذا عن طريق:

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

وهكذا يمكنك أن تجرب شيئا مثل:

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

نصائح أخرى

وكان لي مشكلة مماثلة. ANY الاختيار على XML يحتوي على مساحة محددة (XMLNS = "HTTP: // somenamespace") سوف يؤدي إلى عدم العقد وجدت. غريب جدا بالنظر إلى أنها لا تؤيد الأشكال مساحة إضافية مثل XMLNS: somenamespace = "HTTP: // somenamespace".

في أي حال، من خلال الآن أسهل ما يمكن القيام به هو القيام سلسلة استبدال واستبدال XMLNS = "http://tempuri.org/webservices مع سلسلة فارغة.

وعموما أنا أحب touchxml، ولكن لا أستطيع أن أصدق هذا الخطأ لا يزال موجودا.

وحاول

NSArray *nodes = [myParser nodesForXPath:@"/FundInfo/*" error:&err];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top