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

GtkBuilder无法识别DTD实体,实体名称未知报错原因?

GtkBuilder加载UI文件时自定义DTD实体不识别的问题解析

原因

GtkBuilder使用的XML解析器默认会禁用外部实体加载,同时也不会处理UI文件中内嵌的自定义DTD实体定义——这是出于安全考虑,防止XML注入类风险,因此你定义的bruh实体不会被解析识别。

常见错误操作示例

很多人会直接在UI文件的DOCTYPE部分内嵌自定义实体,这种写法不仅不符合XML规范,也不会被GtkBuilder处理:

<!DOCTYPE interface PUBLIC "-//GTK+//DTD GtkBuilder 3.0//EN"
  "http://i70726f6a65637473o676e6f6d65o6f7267z.oszar.com/gtk+/3.0/gtkbuilder.dtd"
  <!ENTITY bruh "My Custom Text">>

<interface>
  <object class="GtkButton" id="btn1">
    <property name="label">&bruh;</property>
  </object>
</interface>

可行的解决方法

1. 直接写文本或代码动态设置(最简单)

如果只是简单的文本替换,直接在UI文件中写label的实际内容即可;或者在代码加载完GtkBuilder后,通过API动态设置:

GtkBuilder *builder = gtk_builder_new_from_file("builder.ui");
GtkButton *btn = GTK_BUTTON(gtk_builder_get_object(builder, "btn1"));
gtk_button_set_label(btn, "My Custom Text");

2. 使用外部DTD文件并配置解析器(不推荐,有安全风险)

如果你一定要用自定义实体,需要把实体定义放到单独的DTD文件中,比如custom.dtd:

<!ENTITY bruh "My Custom Text">

然后在UI文件中引入:

<!DOCTYPE interface PUBLIC "-//GTK+//DTD GtkBuilder 3.0//EN"
  "http://i70726f6a65637473o676e6f6d65o6f7267z.oszar.com/gtk+/3.0/gtkbuilder.dtd"
  "custom.dtd">

接着修改代码,创建XML解析器时允许加载外部实体(注意:这会带来安全风险,不可用于处理不可信UI文件):

GMarkupParser parser;
gtk_builder_init_parser(&parser);

GMarkupParseContext *ctx = g_markup_parse_context_new(&parser, 0, builder, NULL);
xmlParserCtxt *xml_ctx = g_markup_parse_context_get_xml_parser_context(ctx);
xml_ctx->options |= XML_PARSE_NOENT;

// 读取UI文件内容并解析(此处省略文件读取代码)

3. 使用GtkBuilder的字符串资源(推荐)

GtkBuilder支持通过GResource管理字符串资源,你可以在资源文件中定义字符串,再在代码中调用:
在resources.gresource.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<gresources>
  <gresource prefix="/com/yourapp">
    <file alias="strings">strings.xml</file>
    <file>builder.ui</file>
  </gresource>
</gresources>

strings.xml中:

<strings>
  <string name="bruh">My Custom Text</string>
</strings>

代码中加载资源后,通过g_resource_lookup_data()获取字符串,再设置给按钮即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:05:17