PDA

View Full Version : مبتدی: بدست آوردن مقدار بین ۲ تگ



mosi20
سه شنبه 27 بهمن 1388, 23:44 عصر
سلام
میخوام مقدار بین ۲ تگ را بدست بیارم
مثلا

<item>
<author>1388/11/27</author>
<author>1388/11/28</author>
<author>1388/11/29</author>
<author>1388/11/30</author>
</item>
مقادیر بین author را میخوام بدست بیارم.
ممنون میشم کمکم کنید.

amin1softco
سه شنبه 27 بهمن 1388, 23:51 عصر
مطمئنی سوال را در انجمن درستی مطرح کردی این فرمت xml را میشه خیلی راحتتر با php خوندش ولی اینجام می تونی با یک مقایسه به جواب برسی:متفکر:

mosi20
چهارشنبه 28 بهمن 1388, 00:16 صبح
میدونم با php خیلی راحت تر هست با یک preg_match_all میشه همشونا پیدا کرد ولی من با c++ میخوام
کلا php را فولم.
این c++ هیچی نداره.
هر کاری میخوای بکنی باید بری کلی لایبراری نصب کنی.!
میتونی یه کد بهم بدی که اینا پیدا کنه؟

amin1softco
چهارشنبه 28 بهمن 1388, 00:23 صبح
شما این لینک رو ببین همون چیزی که دنبالشی:
http://www.artima.com/cppsource/xml_data_binding.html

یک روش هم اینه که از سورسی که ضمیمه کردم استفاده بشه
اینم لینک یک برنامه که اینجوری کار می کنه:
http://www.codeproject.com/KB/cpp/paramio.aspx

mosi20
چهارشنبه 28 بهمن 1388, 00:32 صبح
متاسفانه چیزی ازش نفهمیدم.
شرمندم ولی من خیلی مبتدی هستم
این کد را هم برای یه پروژه ی کوچیک اپن سورس میخوام.
اگه میتونی یه مقدار بیشتر راهنمایی کن.
من دیگه دارم دیوانه میشم.
از صبح دارم هی میگرم ولی پیدا نمیکنم.

mosi20
چهارشنبه 28 بهمن 1388, 09:58 صبح
ممنون هنوز بررسی نکردم.
یک سوال دیگه هم داشتم.
یه تابعی مثل splite یا explode برای c++ وجود نداره؟

Salar Ashgi
چهارشنبه 28 بهمن 1388, 10:39 صبح
این C++‎ هیچی نداره.
هر کاری میخوای بکنی باید بری کلی لایبراری نصب کنی.!


فراموش نکنید C همون زبانی هستش که باهاش سیستم عامل نوشتن و ++C پدر بزرگ C هستش ،

پس قدرتش رو دست کم نگیر . آشنا نبودن با یکسری متود های یک زبان دلیل بر ضعف این زبان نیست ،

همین برنامه شما با یک کد 4 - 5 خطی :



#include <iostream>
#include <conio>
#include <string>
using namespace std;
int main(){
string str = "<author>1388/11/27</author>";
cout<<str<<endl;
cout<<"============================\n";
string s1 = str.substr(8,10);
cout<<s1<<endl;
getch();
}

amin1softco
چهارشنبه 28 بهمن 1388, 10:52 صبح
اگر هدر های بوست را به کامپایلر اضافه کنی می شه یک کارایی کرد
http://www.boost.org/doc/libs/1_42_0/doc/html/string_algo/reference.html#header.boost.algorithm.string_hpp

یعنی splite مستقیم به سی اضافه می شه ولی تا جایی که من می دونم خود سی چنین تابعی نداره .
این کدی هم که دوستمون گذاشتند فقط برای همین نوعه یعنی اگه مثلا طول اطلاعات بیشتر از 10 کارکتر بشه کاربرد نداره ولی کلا نظامش تو سی همینه با کمی تغییر می شه تابع splite را پیاده سازی کرد.

Salar Ashgi
چهارشنبه 28 بهمن 1388, 11:00 صبح
این کدی هم که دوستمون گذاشتند فقط برای همین نوعه یعنی اگه مثلا طول اطلاعات بیشتر از 10 کارکتر بشه کاربرد نداره
به هیچ وجه اینطور نیست ، چون تو این حالت رشته ما یک Data Type نیست ، بلکه یک Object ای از کلاس

string هستش و این متود هر زیر رشته ای از رشته رو برای ما استخراج میکنه .

amin1softco
چهارشنبه 28 بهمن 1388, 11:14 صبح
یعنی با این کد می شه به درستی این را خوند:


<author>1388/1/27</author>

البته تا جایی که من می دونم کار این تابع اینه که یک رشته بگیره و از اول رشته به اندازه عدد اول فاصله بگیره و به اندازه عدد دوم را استخراج کنه حالا اگه طول تاریخ کمتر از 10 باشه یا بیشتر باشه این به اندازه 10 کارکتر را جدا می کنه اصلا براش فرقی نداره تاریخه یا ادامه فیلد
شاید من اشتباه می کنم

mosi20
چهارشنبه 28 بهمن 1388, 11:20 صبح
تست کردم
مشکل داره
اینا فقط اولیشا تشخصی میده و اگه یکم جابه جا بشه دیگه کار نمیکنه.

string str = "<author>1388/11/27</author><author> 1388/11/28 </author>";

amin1softco
چهارشنبه 28 بهمن 1388, 11:43 صبح
اینم شبیه سازی تابع explode پی اچ پی در سی:


#include <string>
std::string *explode (std::string original, std::string exploder=".") {
std::string tmp;
tmp=original;
int num, loc;
num=1;
while (tmp.find(exploder)!=std::string::npos) {
loc=tmp.find(exploder);
tmp=tmp.substr(loc+exploder.length());
num++;
}
std::string *result;
result = new std::string[num];
num=0;
tmp=original;
while (tmp.find(exploder)!=std::string::npos) {
loc=tmp.find(exploder);
result[num]=tmp.substr(0,loc);
tmp=tmp.substr(loc+exploder.length());
num++;
}
result[num]=tmp;
return result;
}

در ضمن اگه از vc++2008 استفاده می کنی یک راه ساده تر هم وجود داره برای خواندن و نوشتن xml:
http://msdn.microsoft.com/en-us/library/ms760218%28VS.85%29.aspx

mosi20
چهارشنبه 28 بهمن 1388, 11:58 صبح
ممنون خودم یه کد نوشتم که از همون کد دوستمون الهام گرفتم.
فعلا کارم راه افتاد.
من از لینوکس استفاده میکنم و به هیچ عنوان از محصولات کرک شده و.... استفاده نمیکنم.
شما vC++‎2008 را نسخه ی اصلیشا خریدی یا کرک داری استفاده میکنی؟



#include <iostream>
#include <string>
using namespace std;
int main(){
string str = "salam <author>1388/11/27</author><author> 1388/11/28 </author><author> harchi khasti inja bezar ok? </author>";
int pattern_number = 6;
string pattern_title ="author";
string s1 ;
int find_item_place_first[100];
int find_item_place_last[100];
int find_item_number_first=0;
int find_item_number_last=0;
int find_item_number_total=0;
for ( unsigned i = 0 ; i < str.size() ; ++i ){
s1 = str.substr(i, pattern_number);
if( s1 == pattern_title){

find_item_number_total++;
if( ( find_item_number_total % 2 ) == 0 ){
int number_of_find = (i-2);
find_item_number_last++;
find_item_place_last[find_item_number_last]=number_of_find;
}else{
int number_of_find = (i+pattern_number+1);
find_item_number_first++;
find_item_place_first[find_item_number_first]=number_of_find;
}
}
}
cout<<"============================\n";
for ( unsigned i = 1 ; i <= find_item_number_last ; ++i ){
s1 = str.substr(find_item_place_first[i], ( find_item_place_last[i]- find_item_place_first[i] ));
cout << s1 << " "<<endl;

}
return 1;
}

mosi20
چهارشنبه 28 بهمن 1388, 12:00 عصر
البته یه مشکلی الان پیدا کردم که یک کوچولو کد را تغییر دادم
ممنون از همه