разбирать ACDSee категории

Как можно проанализировать xml-подобную строку и преобразовать ее в отдельный список?

Я пытаюсь преобразовать следующую строку:

<Categories>
<Category Assigned="0">
6 Level
<Category Assigned="1">
6.2 Level
<Category Assigned="0">
6.3 Level
<Category Assigned="0">
6.4 Level
<Category Assigned="1">
6.5 Level
</Category>
</Category>
</Category>
</Category>
</Category>
</Categories>

В отдельный список вроде:

6 Level/6.2 Level/6.3 Level/6.4 Level/6.5 Level, 6 Level/6.2 Level

Робин Миллс из exiv2 предоставил Perl-скрипт:
http://dev.exiv2.org/boards/3/topics/1912?r=1923#message-1923

Это нужно будет также разобрать Assigned="1", Как это можно сделать в C ++ для использования в DigiKam, внутри dmetadata.cpp со структурой как:

    QStringList ntp = tagsPath.replaceInStrings("<Category Assigned="0">", "/");

У меня нет достаточного опыта программирования, чтобы понять это, и я не нашел ни одного примера кода онлайн, который бы делал что-то подобное. Я также хотел бы включить код в сам exiv2, чтобы другие приложения могли получить выгоду.

Рабочий код будет включен в дигикам: https://bugs.kde.org/show_bug.cgi?id=345220

0

Решение

Код, который вы связали, использует Perl XML::Parser::Expat модуль, который является клеевым слоем поверх Джеймса Кларка XML-парсер Expat.

Если вы хотите следовать по тому же маршруту, вы должны написать C ++, который использует ту же библиотеку, но его может быть неуклюже использовать, так как API используется через обратные вызовы, которые вы указываете для вызова при возникновении определенных событий во входящем потоке XML. Вы можете увидеть их в коде Perl, прокомментировал process an start-of-element event и т.п.

После того, как вы связались с библиотекой, должно быть просто написать C-код, который эквивалентен Perl в обратных вызовах — они представляют собой только одну строку каждая. Пожалуйста, откройте новый вопрос, если у вас есть проблемы с пониманием Perl

Также обратите внимание, что Expat — это не проверяющий парсер, который пропускает искаженные данные без комментариев.

Учитывая, что самой большой задачей является анализ данных XML в первую очередь, вы можете предпочесть другое решение, которое позволит вам построить структуру документа в памяти из данных XML и опросить ее, используя Объектная модель документа (DOM). libxml библиотека позволяет вам сделать это, и имеет свой собственный слой клея Perl в XML::LibXML модуль

0

Другие решения

Майк Куалманн предоставил рабочий патч для дигикам!

QString xmlACDSee = getXmpTagString("Xmp.acdsee.categories", false);
if (!xmlACDSee.isEmpty())
{
xmlACDSee.remove("</Categories>");
xmlACDSee.remove("<Categories>");
xmlACDSee.replace("/", "|");

QStringList tagsXml = xmlACDSee.split("<Category Assigned");
int category        = 0;
int length;
int count;

foreach(const QString& tags, tagsXml)
{
if (!tags.isEmpty())
{
count  = tags.count("<|Category>");
length = tags.length() - (11 * count) - 5;

if (category == 0)
{
tagsPath << tags.mid(5, length);
}
else
{
tagsPath.last().append(QString("/") + tags.mid(5, length));
}

category = category - count + 1;

if (tags.left(5) == QString("=\"1\">") && category > 0)
{
tagsPath << tagsPath.value(tagsPath.size() - count - 1);
}
}
}

if (!tagsPath.isEmpty())
{
return true;
}
}
0

По вопросам рекламы [email protected]