首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析ACDSee类别

解析ACDSee类别
EN

Stack Overflow用户
提问于 2015-04-12 02:11:41
回答 2查看 93关注 0票数 1

如何解析类似xml的字符串并将其转换为单独的列表?

我正在尝试转换以下字符串:

代码语言:javascript
运行
复制
<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>

添加到单独的列表中,如下所示:

代码语言:javascript
运行
复制
6 Level/6.2 Level/6.3 Level/6.4 Level/6.5 Level, 6 Level/6.2 Level

exiv2的Robin Mills提供了一个perl脚本:http://dev.exiv2.org/boards/3/topics/1912?r=1923#message-1923

这也需要解析Assigned="1"。如何在C++中实现这一点,以便在digikam中使用,在dmetadata.cpp中具有如下结构:

代码语言:javascript
运行
复制
    QStringList ntp = tagsPath.replaceInStrings("<Category Assigned="0">", "/");

我没有足够的编程背景来解决这个问题,也没有在网上找到任何做类似事情的代码样本。我还希望将代码包含在exiv2本身中,以便其他应用程序也能从中受益。

工作代码将包含在digikam中:https://bugs.kde.org/show_bug.cgi?id=345220

EN

回答 2

Stack Overflow用户

发布于 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粘合层

票数 0
EN

Stack Overflow用户

发布于 2015-04-18 22:49:29

Maik Qualmann已经为digikam提供了一个可用的补丁!

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29581332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档