字符串截取的问题,如何快速截取?

发布于 2021-11-16 04:28:52 字数 232 浏览 787 评论 4

有个很长的字符串,是个webservice报文,xml格式的,内部的结构不清楚,我想取其中一个标签中得值,截取字符串态麻烦,有没有简便方法,如: ....<tag1/><ttagd>dls1234</ttagd></tag1> ......

我想取  <ttagd></ttagd>之间的内容,可能有多个相同的tag,我只取第一个里面的值  

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

女中豪杰 2021-11-17 12:53:53
// 内存匹配函数memfind
char* memfind(const char* buf, const char* tofind, size_t len)
{
    size_t findlen = strlen(tofind);
    if (findlen > len) {
        return((char*)NULL);
    }
    if (len < 1) {
        return((char*)buf);
    }

    {
        const char* bufend = &buf[len - findlen + 1];
        const char* c = buf;
        for (; c < bufend; c++) {
            if (*c == *tofind) { // first letter matches
                if (!memcmp(c + 1, tofind + 1, findlen - 1)) { // found
                    return((char*)c);
                }
            }
        }
    }

    return((char*)NULL);
}

// 内存搜索,提取标记之间字符,装载到字符串容器
bool menSearch_FlagToMap(const char* buffer, size_t count,
                         const char* flag_beg, const char* flag_end,
                         map<string, size_t> &flag_map)
{
    const char* ps = buffer;
    char* pch = NULL;
    char* pch2 = NULL;
    pch = memfind(ps, flag_beg , count);
    if (pch == NULL) {
     //   printf("警告: 内存缓冲区找不到 flag_begn");
        return false;
    }
    while (pch != NULL) {
        pch2 = memfind(pch, flag_end , 1024 * 10); //  估计标签大小的上限 10K,按情况
        if (pch2 != NULL) {
            string str(pch + strlen(flag_beg) , pch2);
            {
                // Utf-8 转 GBK string版本,按需求是否屏蔽改语句
                ConvertUtf8ToGBK(str);
            }
            ++flag_map[str]; // 装载到字符串容器
        }
        ps = pch + strlen(flag_beg);
        pch = memfind(ps, flag_beg , count - (ps - buffer));
    }
    return true;
}


///////////////////////////
const char* flag_beg = "<stFnt:fontFileName>";
    const char* flag_end = "</stFnt:fontFileName>";
    map<string, size_t> map_fontFileName;
    map<string, size_t>::iterator iter_Fnt;
    // 把fontFileName装载到容器 map_fontFileName <字体文件名>
    if (menSearch_FlagToMap(buffile, idf_size, flag_beg, flag_end, map_fontFileName))
        ;
    else
        cout << "请确认文档是否存在!n";

风柔一江水 2021-11-17 12:35:02

自己解析起来一是麻烦bug多
另外就是不好维护,用工具多好

初见你 2021-11-17 08:16:39

xml也能当成html处理的,然后用jsoup去解析内容,还是不错的。格式有问题,就htmlcleaner先格式化一下。jsoup的select语法还是很好用的。

Document doc = Jsoup.parse("<tag1/><ttagd>dls1234</ttagd></tag1>");
System.out.println(doc.select("ttagd").first().text());

懒人速成法

谁的新欢旧爱 2021-11-16 05:27:57

能否通过正则来处理,我要从报文里取好几个不同标签的值

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文