0

我能够自省 DBus 节点,并获得一些 XML,其中包含有关子节点的信息。但是,这需要我解析 XML,并且我试图保持应用程序的轻量级。我可以使用什么 gdbus 函数来简单地获取子节点对象名称的列表?

这是获取 XML 的代码。

#include <stdio.h>
#include <stdlib.h>
#include <gio/gio.h>

int main(int argc,char *argv[])
{
GError *err=NULL;
GVariant *result;
GDBusConnection *c;
const char *xml;

    if ((c = g_bus_get_sync(G_BUS_TYPE_SYSTEM,NULL,&err)) == NULL) {
        if (err) fprintf(stderr,"g_bus_get error: %s\n",err->message);
        exit(1);
    } /* if */
    result = g_dbus_connection_call_sync(c,"org.bluez","/org/bluez",
                        "org.freedesktop.DBus.Introspectable",
                        "Introspect",NULL,G_VARIANT_TYPE("(s)"),
                        G_DBUS_CALL_FLAGS_NONE,3000,NULL,&err);
    if (result==NULL) {
        if (err) fprintf(stderr,"gbus_connection_call error: %s\n",
            err->message);
        exit(1);
    } /* if */
    g_variant_get(result,"(&s)",&xml);
    printf("%s\n",xml);
    exit(0);
}

所以上面的代码有效。在返回的 XML 的深处,有一些元素描述了 org.bluez 对象节点的子节点。就我而言,有一个元素是这样的:

<node name="hci0"></node>.

但是,我不想解析 XML 来找到它。还有哪些其他 gdbus 函数可用于简单地检索 org.bluez 的子项的名称,而不需要 XML 解析器?

4

1 回答 1

1

我认为您最好的选择是使用内置的 XML 解析器。这就是gdbus introspect命令行工具的实现方式。

调用g_dbus_node_info_new_for_xml函数来解析 XML。这给你一个GDBusNodeInfo,你必须免费使用g_dbus_node_info_unref()。我能找到的关于如何使用它的最佳示例是这里,它解析 XML,然后循环遍历nodes返回的结构的元素。

于 2019-01-09T21:39:55.093 回答