سؤال

لنفترض أن لدينا مستند XML التالي:

<root>
    <options>
        ...
    </options>
    <children>
        <child name="first">12345</child>
        <child name="second">
            <additionalInfo>abcd</additionalInfo>
    </children>
</root>

أرغب في الحصول على تمثيل سلسلة للعقد "الفرعية" وإلحاقها بمصفوفة (لا أريد أن أفقد بناء جملة XML لذا فإن .text() ليس خيارًا).على سبيل المثال، سيبدو الطفل الأول كما يلي:

QString child = "<child name="first">12345</child>";

لقد استخدمت الكود التالي للحصول على العناصر:

QDomDocument doc;
QDomElement element;
element = xml->documentElement();
if(element.isNull() == false)
{
    element = element.firstChildElement("children");
    if(element.isNull()) return;

    element = element.firstChildElement("child");
    while(element.isNull() == false)
    {
        doc = element.toDocument();
        if(doc.isNull() == false)
        {
            // save string into array
            array.append(doc.toString());
        }
        element = element.nextSiblingElement("child");
    }
}

المشكلة هي أن doc.isNull يُرجع دائمًا خطأ (يبدو أنني غير قادر على تحويل العنصر إلى مستند).هل هناك أي طريقة كيف يمكنني القيام بذلك؟

يحرر:

أود أن أضيف أن QString ليس إلزاميًا هنا.في الأساس، أي فئة يمكن استخدامها لاحقًا لاسترداد البيانات لا بأس بها (سأحفظ هذه العقد وأستخدمها لتهيئة كائنات أخرى لاحقًا).الشيء المهم هو أنني يجب أن أكون قادرًا على الوصول إلى تلك القيم حتى عندما يتم تدمير المستند الأصلي. على سبيل المثال، من الممكن تخزين هذه العناصر مباشرة في بعض المصفوفات (على سبيل المثال.QList)، والتي يمكن استخدامها للوصول إليها لاحقًا.

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

المحلول

سأضيف إجابة على سؤالي الخاص.لا فكرة لماذا، ولكن يبدو أنني فاتني الوظيفة التالية في الوثائق.

void qdomnode :: حفظ (qtextstream & str، int indent) const

يفعل ذلك كثيرا ما أحتاج إلى تحويل عقدة إلى سلسلة، E.G:

giveacodicetagpre.

نصائح أخرى

نظرًا لأنك تحتاج إلى تنسيق XML نفسه، فلن تحتاج إليه QDomElement أو QDomDocument. QDomElement و QDomDocument يستخدم للحصول على البيانات المخزنة في وثائق XML.

كل ما تحتاجه هو اجتياز ملف عادي.

افتح الملف باستخدام

bool QFile::open ( OpenMode mode )   [virtual]

يمكنك قراءة محتويات الملف بالكامل عن طريق،

QByteArray QIODevice::readAll ()

والتي يمكنك تخصيصها ل QString.

على سبيل المثال،

QString entireContents = xmlFile->readAll();

ثم يمكنك تقسيم المحتويات بالكامل بناءً على خط جديد \n حرف باستخدام

QStringList QString::split ( const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const

الآن يتوافق كل فهرس مع كل سطر في ملف XML.يمكنك اجتيازه والحصول على خطوط الاهتمام المطلوبة.

آمل أن يساعد...

حسنا، أعتقد أنك غير قادر على فعل ما تريد مع فئات QT XML، ولكن يجب أن يكون من الممكن إعادة بناء السلسلة بنفسك (ربما لا تتطابق مع الأصل بنسبة 100٪، ولكن بنفس المعنى)، بناء على نفس المعنى)، بناء على نفس المعنى)، بناء على نفس المعنى)، بناء علىطرق فئات QT XML توفر.

تحرير: مقتطف رمز صغير قد يفعل الشيء (غير مختبر):

giveacodicetagpre.

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