You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C语言中使用mini-xml获取含d:id属性节点的值的问题

问题描述

已成功获取其他节点的字符串,但无法获取某一节点的值。d:id属性似乎导致了异常,无法得到值68857444。尝试了mxmlGetText、mxmlGetInteger等函数,均未返回目标值,mxmlGetElement返回cOwnedEntity,请问应该使用哪个函数?

尝试的代码示例:

mxml_node_t * node_numero_interne=mxmlFindElement(node_Signal, node_Signal,
                                       "cOwnedEntity", NULL, NULL,
                                       MXML_DESCEND_ALL);


    if(node_numero_interne!=NULL) // trouvé
    {
        const char *numero_interne=mxmlGetText(node_numero_interne, false);
        printf("numero interne = %s\n", numero_interne);
    }
解决方案

你的问题核心是命名空间未正确处理或用错了获取值的函数,分两种情况处理:

情况1:目标值是cOwnedEntity节点的d:id属性值

如果68857444是d:id属性的内容,需要用mxmlGetAttr(或mxmlGetAttrByNs)获取属性,同时在查找节点时指定命名空间URI:

// 替换成你的XML中d:前缀对应的实际命名空间URI
const char *d_ns = "http://your-namespace-uri-for-d";

mxml_node_t * node_numero_interne = mxmlFindElement(node_Signal, node_Signal,
                                       "cOwnedEntity", d_ns, NULL,
                                       MXML_DESCEND_ALL);

if(node_numero_interne != NULL)
{
    // 获取d:id属性值
    const char *numero_interne = mxmlGetAttr(node_numero_interne, "d:id");
    // 或者用命名空间精准匹配
    // const char *numero_interne = mxmlGetAttrByNs(node_numero_interne, d_ns, "id");
    
    if(numero_interne != NULL)
    {
        printf("numero interne = %s\n", numero_interne);
        // 转成整数使用
        int num = atoi(numero_interne);
        printf("numero interne (integer) = %d\n", num);
    }
    else
    {
        printf("未找到d:id属性\n");
    }
}

情况2:目标值是cOwnedEntity的子节点文本

如果68857444是cOwnedEntity节点下某个子节点的文本内容,需要先找到对应的子节点,再用mxmlGetText获取:

const char *d_ns = "http://your-namespace-uri-for-d";

mxml_node_t * node_numero_interne = mxmlFindElement(node_Signal, node_Signal,
                                       "cOwnedEntity", d_ns, NULL,
                                       MXML_DESCEND_ALL);

if(node_numero_interne != NULL)
{
    // 替换成实际存储目标值的子节点名称
    mxml_node_t *id_subnode = mxmlFindElement(node_numero_interne, node_numero_interne,
                                               "TargetChildNode", NULL, NULL, MXML_DESCEND_FIRST);
    if(id_subnode != NULL)
    {
        const char *numero_interne = mxmlGetText(id_subnode, false);
        printf("numero interne = %s\n", numero_interne);
    }
    else
    {
        printf("未找到目标子节点\n");
    }
}

关键说明

  • XML中的d:前缀代表命名空间,mxmlFindElement的第四个参数必须传入对应的命名空间URI,否则无法匹配到正确的节点;
  • mxmlGetText用于获取节点内部的文本内容,mxmlGetAttr用于获取节点的属性值,两者不可混用。

内容的提问来源于stack exchange,提问作者Michel Merle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:35:01