如何解析类似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 Levelexiv2的Robin Mills提供了一个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本身中,以便其他应用程序也能从中受益。
工作代码将包含在digikam中:https://bugs.kde.org/show_bug.cgi?id=345220
发布于 2015-04-12 03:54:17
您所链接的代码利用了Perl的XML::Parser::Expat模块,它是James Clark的Expat XML parser之上的粘合层。
如果您想遵循相同的路线,则应该编写使用相同库的C++,但是使用起来可能很笨拙,因为该API是通过回调来实现的,您指定在传入的XML流中发生某些事件时调用该回调。您可以在Perl代码、注释process an start-of-element event等中看到它们。
链接到库之后,编写等同于回调中的Perl的C代码应该很简单--每个回调只有一行。如果您在理解Perl时遇到问题,请打开一个新问题。
还要注意的是,Expat是一个非验证解析器,它会让格式错误的数据不带注释地通过
考虑到最大的任务首先是解析XML数据,您可能更喜欢一种不同的解决方案,它允许您从XML数据构建内存中的文档结构,并使用Document Object Model (DOM)对其进行查询。Perl库允许您这样做,并且在XML::LibXML模块中有自己的libxml粘合层
发布于 2015-04-18 22:49:29
Maik Qualmann已经为digikam提供了一个可用的补丁!
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;
}
}https://stackoverflow.com/questions/29581332
复制相似问题