1

次のような xml ドキュメントを作成します。

<doc>
  <node1>
    <value1>aa bb</value1>
    <value2>cc dd</value2>
  </node1>
  <node2>
    <value1>aaa bbb</value1>
    <value2>ccc ddd</value2>
  </node2>
</doc>

このドキュメントを minixml ライブラリで解析しようとしました:

    mxml_node_t                 *b = tree, *c; //tree is global variable

    while (b) {
        if (b && b->type == MXML_ELEMENT) {
            if(strcmp(b->value.element.name, "value1") == 0)
            {
                c = mxmlWalkNext(b, b, MXML_DESCEND);
                if (c && c->type == MXML_TEXT)
                {
                    if(c->value.text.string != NULL)
                    {
                        printf("value1=%s"c->value.text.string);
                    }
                }
            }
        }
        if (b && b->type == MXML_ELEMENT) {
            if(strcmp(b->value.element.name, "value2") == 0)
            {
                c = mxmlWalkNext(b, b, MXML_DESCEND);
                if (c && c->type == MXML_TEXT)
                {
                    if(c->value.text.string != NULL)
                    {
                        printf("value2=%s"c->value.text.string);
                    }
                }
            }
        }
        b = mxmlWalkNext(b, tree, MXML_DESCEND);
    }

ファイルを解析すると、次の結果が見つかりました。

value1=aa //the value is not right it must be "aa bb"
value2=cc
...

私の問題を解決する方法はありますか?

4

1 に答える 1

0

次のソリューションを使用しました。

mxml_node_t                 *b = tree; //tree is global variable
char                        *tmp,*value1=NULL,*value2=NULL;

while (b) {
    if (b && b->type == MXML_TEXT &&
        b->value.text.string &&
        b->parent->type == MXML_ELEMENT &&
        !strcmp(b->parent->value.element.name, "value1"))
        {
            if(value1 != NULL)
            {
                value1 = strdup(b->value.text.string);
            }
            else
            {
                tmp = value1;
                if (asprintf(&value1,"%s %s",tmp, b->value.text.string) == -1)
                {
                    return -1;
                }
                free(tmp);
                tmp=NULL;
            }
        }
        else
        {
            if (value1!=NULL)
            {
                printf("value1=%s",value1);
                free(value1);
                value1=NULL;
            }
        }
    if (b && b->type == MXML_TEXT &&
        b->value.text.string &&
        b->parent->type == MXML_ELEMENT &&
        !strcmp(b->parent->value.element.name, "value2"))
        {
            if(value2 != NULL)
            {
                value2 = strdup(b->value.text.string);
            }
            else
            {
                tmp = value2;
                if (asprintf(&value2,"%s %s",tmp, b->value.text.string) == -1)
                {
                    return -1;
                }
                free(tmp);
                tmp=NULL;
            }
        }
        else
        {
            if (value2!=NULL)
            {
                printf("value2=%s",value2);
                free(value2);
                value2=NULL;
            }
        }
    b = mxmlWalkNext(b, tree, MXML_DESCEND);
}
于 2013-07-15T09:13:43.957 に答える