سؤال

وهذا قد يبدو وكأنه سؤال بسيط.

ولكن أنا قد تبحث عن محلل XML لاستخدامها في أحد التطبيقات بلدي الذي يعمل على لينكس.

الوافدة ووتحليل ملف XML لي من خلال قراءة واحدة في. ومع ذلك، فإن الناتج هو نفس الإدخال.

وهذا هو الملف الخاص بي أنا أقرأ في:

<?xml version="1.0" encoding="utf-8"?>
    <books>
         <book>
              <id>1</id>
              <name>Hello, world!</name>
         </book>
    </books>

ولكن، بعد أن مرت هذه، وأحصل على بالضبط نفس الإخراج. يجعلني أتساءل ما هو محلل ل؟

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

int parse_xml(char *buff)
{
    FILE *fp;
    fp = fopen("mybook.xml", "r");
    if(fp == NULL)
    {
        printf("Failed to open file\n");
        return 1;
    }

   /* Obtain the file size. */
    fseek (fp, 0, SEEK_END);
    size_t file_size = ftell(fp);
    rewind(fp);

    XML_Parser parser = XML_ParserCreate(NULL);
    int done;
    memset(buff, 0, sizeof(buff));

    do
    {
        size_t len = fread(buff, 1, file_size, fp);
        done = len < sizeof(buff);

        if(XML_Parse(parser, buff, len, done) == XML_STATUS_ERROR)
        {
            printf("%s at line %d\n", XML_ErrorString(XML_GetErrorCode(parser)),
                                      XML_GetCurrentLineNumber(parser));
            return 1;
        }
    }
    while(!done);

    fclose(fp);
    XML_ParserFree(parser);

    return 0;
}
هل كانت مفيدة؟

المحلول

واستغرق الأمر بعض الوقت للالتفاف رأسي حول XML تحليل (على الرغم من أن أفعل ذلك في بيرل، وليس C). في الأساس، يمكنك تسجيل وظائف الاستدعاء. سوف محلل بينغ رد الاتصال لكل عقدة ويمر في بنية بيانات تحتوي على جميع أنواع بت العصير (مثل نص عادي، أي سمات والأطفال العقد، وما إلى ذلك). لديك للحفاظ على نوع من معلومات الحالة - مثل شجرة تجزئة قمت بتوصيل الاشياء في، أو سلسلة يحتوي على كافة الشجاعة، ولكن أيا من XML

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

نصائح أخرى

والمغتربين هو محلل مدفوعة حتى. لديك لكتابة التعليمات البرمجية للتعامل مع العلامات، وسمات وغيرها، وبعد ذلك تسجيل الرمز مع محلل. هناك مقال هنا الذي يصف كيفية القيام هذا.

وفيما يتعلق القراءة من مأخذ، اعتمادا على النظام الأساسي الخاص بك قد تكون قادرة على التعامل مع مقبس مثل مثل مؤشر ملف. خلاف ذلك، ما عليك القيام به القراءة الخاصة بك من المقبس ثم تمرير البيانات إلى المغتربين صراحة. هناك API للقيام بذلك. ومع ذلك، فما استقاموا لكم فاستقيموا محاولة للحصول على انها تعمل مع الملفات العادية الأولى.

وبدلا من المغتربين، قد ترغب في إلقاء نظرة على libxml2، التي ربما بالفعل في التوزيع. ان الكثير أقوى من المغتربين، ويوفر لك جميع أنواع الأشياء الجيدة: DOM (وضع شجرة)، SAX (تدفق واسطة)، كسباث (لا غنى عنه لفعل أي شيء معقد مع IMHO XML) وأكثر من ذلك. انها ليست خفيفة الوزن مثل المغتربين، لكنه أسهل بكثير للاستخدام.

حسنا، اخترت محلل XML الأكثر تعقيدا (موزعي الحدث يحركها أكثر صعوبة في التعامل). لماذا الوافدة وليس libxml ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top