2013-05-10 4 views
0

Я работаю над модульным тестом для загрузчика метаданных, который принимает QDomNode и извлекает информацию в std :: map. Теперь я должен создать QDomNode, содержащий всю информацию, которую хочу извлечь. Обычно этот узел берется из XML-файла, поэтому я думал, что я мог бы сделать это следующим образом:Как создать QDomNodes вручную?

QDomNode metaNode() 
{ 
    QDomDocument document; 

    QByteArray metaArray(
    "<item name=\"author\">testManager</item>" 
    "<item name=\"campaign\">testCampaign</item>" 
    "<item name=\"comment\">testComment</item>" 
    "<item name=\"date\">25.04.2013</item>" 
    "<item name=\"description\">testDescription</item>" 
    "<item name=\"projnum\">1</item>" 
    "<item name=\"title\">test</item>"); 

    document.setContent(metaArray); 
    QDomNode meta = document; 

    return meta; 
} 

Но это не похоже на работу. Когда я вызываю meta.childNodes(), я ожидаю список из семи элементов, но получаю только первый, содержащий имя «автор» со значением «testManager»;

+0

Это не действительный XML AFAIK. Вам нужен узловой контейнер «контейнер». – Mat

+0

Вы имели в виду что-то вроде добавления (см. Обновление)? – LarissaGodzilla

+0

Да. Теперь, когда единственный дочерний узел (корень) должен иметь всех правильных детей. – Mat

ответ

1

Итак, после того, как Мат указал, что у меня отсутствует узел контейнера, я попробовал это и заработал.
Это рабочий код, который позволяет мне использовать узел так же, как он был прочитан из Xml-файл (но без зависимостей файловой системы):

QDomNode metaNode() 
{ 
    QDomDocument document; 

    QByteArray metaArray(
    "<metadata>" 
    "<item name=\"author\">testManager</item>" 
    "<item name=\"campaign\">testCampaign</item>" 
    "<item name=\"comment\">testComment</item>" 
    "<item name=\"date\">25.04.2013</item>" 
    "<item name=\"description\">testDescription</item>" 
    "<item name=\"projnum\">1</item>" 
    "<item name=\"title\">test</item>" 
    "</metadata>"); 

    document.setContent(metaArray); 
    QDomNode meta = document; 

    return meta; 
} 
+0

FYI, этот «контейнерный» узел обычно называется «элементом документа». В вашем примере 'document.getDocumentElement(). TagName()' будет возвращать метаданные. –

0

Использование фактического файла test.xml не поможет сделать тест лучше? Поскольку вы действительно хотите протестировать свой код, который принимает .xml-файл и возвращает QMap, я думаю, что было бы лучше использовать XML-файл и с тестом.

+0

Мне не нужны зависимости от файловой системы, поэтому мне нужно сгенерировать «файлы», которые нам нужны во время выполнения. Таким образом, фактические файлы не являются опцией, если это можно сделать другим способом. – LarissaGodzilla

+0

Хорошо, вы знаете, что вам нужно, я просто сделал предложение. Если вы не можете заставить QDomNode работать, класс QDomDocument имеет определенную поддержку для создания в памяти xml, см. Документацию здесь: http://qt-project.org/doc/qt-4.8/qdomdocument.html#details // В любом случае, я все еще думаю, что файл test.xml более важен для теста (а также легко устанавливается) – Zlatomir

+0

Да, In-Memory-Xml - это подход, который я собираюсь использовать с QDomNode. Во всяком случае, я не хотел останавливать ваше предложение. Это действительный подход, он просто не соответствует моим требованиям. – LarissaGodzilla

Смежные вопросы