سلام
میخوام مقدار بین ۲ تگ را بدست بیارم
مثلا
<item>
<author>1388/11/27</author>
<author>1388/11/28</author>
<author>1388/11/29</author>
<author>1388/11/30</author>
</item>
مقادیر بین author را میخوام بدست بیارم.
ممنون میشم کمکم کنید.
سلام
میخوام مقدار بین ۲ تگ را بدست بیارم
مثلا
<item>
<author>1388/11/27</author>
<author>1388/11/28</author>
<author>1388/11/29</author>
<author>1388/11/30</author>
</item>
مقادیر بین author را میخوام بدست بیارم.
ممنون میشم کمکم کنید.
مطمئنی سوال را در انجمن درستی مطرح کردی این فرمت xml را میشه خیلی راحتتر با php خوندش ولی اینجام می تونی با یک مقایسه به جواب برسی
میدونم با php خیلی راحت تر هست با یک preg_match_all میشه همشونا پیدا کرد ولی من با C++ میخوام
کلا php را فولم.
این C++ هیچی نداره.
هر کاری میخوای بکنی باید بری کلی لایبراری نصب کنی.!
میتونی یه کد بهم بدی که اینا پیدا کنه؟
شما این لینک رو ببین همون چیزی که دنبالشی:
http://www.artima.com/cppsource/xml_data_binding.html
یک روش هم اینه که از سورسی که ضمیمه کردم استفاده بشه
اینم لینک یک برنامه که اینجوری کار می کنه:
http://www.codeproject.com/KB/cpp/paramio.aspx
آخرین ویرایش به وسیله amin1softco : چهارشنبه 28 بهمن 1388 در 00:36 صبح
متاسفانه چیزی ازش نفهمیدم.
شرمندم ولی من خیلی مبتدی هستم
این کد را هم برای یه پروژه ی کوچیک اپن سورس میخوام.
اگه میتونی یه مقدار بیشتر راهنمایی کن.
من دیگه دارم دیوانه میشم.
از صبح دارم هی میگرم ولی پیدا نمیکنم.
ممنون هنوز بررسی نکردم.
یک سوال دیگه هم داشتم.
یه تابعی مثل splite یا explode برای C++ وجود نداره؟
فراموش نکنید 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();
}
اگر هدر های بوست را به کامپایلر اضافه کنی می شه یک کارایی کرد
http://www.boost.org/doc/libs/1_42_0...thm.string_hpp
یعنی splite مستقیم به سی اضافه می شه ولی تا جایی که من می دونم خود سی چنین تابعی نداره .
این کدی هم که دوستمون گذاشتند فقط برای همین نوعه یعنی اگه مثلا طول اطلاعات بیشتر از 10 کارکتر بشه کاربرد نداره ولی کلا نظامش تو سی همینه با کمی تغییر می شه تابع splite را پیاده سازی کرد.
به هیچ وجه اینطور نیست ، چون تو این حالت رشته ما یک Data Type نیست ، بلکه یک Object ای از کلاساین کدی هم که دوستمون گذاشتند فقط برای همین نوعه یعنی اگه مثلا طول اطلاعات بیشتر از 10 کارکتر بشه کاربرد نداره
string هستش و این متود هر زیر رشته ای از رشته رو برای ما استخراج میکنه .
یعنی با این کد می شه به درستی این را خوند:
<author>1388/1/27</author>
البته تا جایی که من می دونم کار این تابع اینه که یک رشته بگیره و از اول رشته به اندازه عدد اول فاصله بگیره و به اندازه عدد دوم را استخراج کنه حالا اگه طول تاریخ کمتر از 10 باشه یا بیشتر باشه این به اندازه 10 کارکتر را جدا می کنه اصلا براش فرقی نداره تاریخه یا ادامه فیلد
شاید من اشتباه می کنم
تست کردم
مشکل داره
اینا فقط اولیشا تشخصی میده و اگه یکم جابه جا بشه دیگه کار نمیکنه.
string str = "<author>1388/11/27</author><author> 1388/11/28 </author>";
اینم شبیه سازی تابع 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/libr...8VS.85%29.aspx
ممنون خودم یه کد نوشتم که از همون کد دوستمون الهام گرفتم.
فعلا کارم راه افتاد.
من از لینوکس استفاده میکنم و به هیچ عنوان از محصولات کرک شده و.... استفاده نمیکنم.
شما 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;
}
البته یه مشکلی الان پیدا کردم که یک کوچولو کد را تغییر دادم
ممنون از همه