انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: #elahe# در 08 تیر 1393، 12:32 قظ
-
سلام
من یه فایل xml دارم
چند هزار خط کد هستش
هر 10-20 خط یه سطری هست به این صورت
<Tag>phrase</Tag>
البته این phrase متغیر هست و این کد رو به عنوان مثال عرض کردم
من میخوام این phrase ها رو از این فایل استخراج کنم
البته اومدم از تو notepad ++ عبارت <Tag> رو سرچ کردم و همه این سطرها رو واسم آورد
اومدم تگها رو توسط همین notepad ++ حذف کنم دیدم شماره سطرها هم هستند و باید دونه دونه حذفشون کنم
مثل این :
Line 222: <Tag>phrase1</Tag>
Line 241: <Tag>phrase2</Tag>
Line 260: <Tag>phrase3</Tag>
Line 279: <Tag>phrase4</Tag>
Line 298: <Tag>phrase5</Tag>
Line 317: <Tag>phrase6</Tag>
اون شماره سطرها مزاحم کارم شدند
واسه همین دست به دامان کدنویسی شدم
یه کدی میخوام که عبارتهای داخل تگ Tag رو واسم استخراج کنه
مرسی
-
این فکر کنم بتونه کمکت کنه:
https://stackoverflow.com/questions/2222150/extraction-of-data-from-a-simple-xml-file
-
منطقا باید بتونی بسیار راحت با regexها خطوط و اطلاعاتی که می خوای رو پیدا کنی. ولی بدون داشتن فایل دقیق (حداقل قسمت قابل قبولی از اون) نمی شه نظر داد. دستور grep به راحتی جواب می ده و اگر می خوای فایل یا یک بخش خوبی اش رو بفرست که بشه نوشت کد رو.
-
البته اینم بگم که روش درست تر از نظر برنامه نویسی، نوشتن یک برنامه کوچیک است که واقعا ایکس ام ال رو بفهمه و چیزی که می خوای رو نشون بده.
-
مرسی از دوستان
با عبارات منظم حلش کردم
تو پی اچ پی
'#^\s*<tag>(.*?)</tag>$#im'
و راحت تر از اون تو spreadsheet هم تونستم تگها رو استخراج کنم
-
البته اینم بگم که روش درست تر از نظر برنامه نویسی، نوشتن یک برنامه کوچیک است که واقعا ایکس ام ال رو بفهمه و چیزی که می خوای رو نشون بده.
جادی همه یا حداقل اکثر زبانهای برنامه نویسی کلاس(های)ی واسه کار با xml دارند
-
البته اینم بگم که روش درست تر از نظر برنامه نویسی، نوشتن یک برنامه کوچیک است که واقعا ایکس ام ال رو بفهمه و چیزی که می خوای رو نشون بده.
سلام
ببخشید که من پس از حل شدن موضوع پاسخ ارسال میکنم.
سعی کردم با سی یه برنامه کوچیک برای این کار بنویسم:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//max line length for reading
#define LINE_LENGTH 800
int main(int argc, char *argv[])
{
FILE *file;
char line[LINE_LENGTH];
char *begin, *end, *i;
//check if we have 2 args
if (argc != 2)
{
fprintf(stderr, "Invalid arguments.");
exit(EXIT_FAILURE);
}
//use first arg as file address
file = fopen(argv[1], "r");
//read the file and search for lines with <Tag>
while (fgets(line, LINE_LENGTH, file) != NULL)
if (strstr(line,"<Tag>") != NULL && strstr(line,"</Tag>") != NULL)
{
//find beginning & end of the phrase
begin = strstr(line, "<Tag>") + 5;
end = strstr(line, "</Tag>");
//print the phrase
for (i = begin ; i < end ; i++)
putchar(*i);
//print a new line after each phrase
printf("\n");
}
fclose(file);
return(EXIT_SUCCESS);
}
این برنامه فایل رو خط به خط میخونه. (تا سقف ۸۰۰ کاراکتر یرای هر خط)
بعد دنبال خطهایی میگرده که دارای عبارتهای <Tag> و </Tag> باشند.
وقتی خط رو پیدا کرد کاراکترهایی که بین این دو عبارت هستند رو چاپ میکنه.
مثلا فایل xml ما به این صورت هست:
ansa<Tag>salam</Tag> fdf
s
<Tag>ahmad</Tag>cc
برای استفاده، متن برنامه رو توی یه فایل به اسم find.c ذخیره کنید.
و سپس:
ahmad@ahmad-desktop:~/test$ gcc find.c -o find
ahmad@ahmad-desktop:~/test$ ./find new.xml
salam
ahmad
همچنین میتونید خروجی رو به یک فایل تغییر بدید تا عبارتها توی اون فایل ذخیره بشه:
./find new.xml >output
-
ممنون جناب حمزه ای
عالی بود
البته تست نکردم هنوز کدتون رو
به غیز از بار آموزشیش حتمن واسم به درد خواهد خورد
مرسی
-
البته اینم بگم که روش درست تر از نظر برنامه نویسی، نوشتن یک برنامه کوچیک است که واقعا ایکس ام ال رو بفهمه و چیزی که می خوای رو نشون بده.
جادی همه یا حداقل اکثر زبانهای برنامه نویسی کلاس(های)ی واسه کار با xml دارند
بله بدون شک. منم نگفتم ایکس ام ال رو شخصا پارز کنی. منظورم این بود که به جای رجکس ها با یک برنامه کوچیک واقعا ایکس ام ال رو بخونی و بخش های مورد نظر رو جدا کنی.