تحويل QDomElement إلى فئة QString / Container
سؤال
لنفترض أن لدينا مستند 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)، والتي يمكن استخدامها للوصول إليها لاحقًا.
المحلول
سأضيف إجابة على سؤالي الخاص.لا فكرة لماذا، ولكن يبدو أنني فاتني الوظيفة التالية في الوثائق.
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.