我想将 xml 文件解析为 Xml.Doc 对象,并针对 Vala 中的模式文件对其进行验证。Vala 是否提供此功能?我搜索了http://valadoc.org,但找不到任何东西。
如果您在 libxml 中寻找与 C 函数等效的 Vala,您只需搜索libxml-2.0.vapi并查找 cname。Valadoc.org 目前不允许您搜索 C 符号,尽管 AFAIK 计划了该功能。
我希望 Vala 中可以使用以下 C 函数:
- xmlSchemaParserCtxtPtr parser_ctxt = xmlSchemaNewDocParserCtxt(schema_doc);
- xmlSchemaPtr 模式 = xmlSchemaParse(parser_ctxt);
- xmlSchemaValidCtxtPtr valid_ctxt = xmlSchemaNewValidCtxt(schema);
libxml-2.0 Vala 绑定非常不完整,没有人愿意使用它们,因为 C API 非常混乱。通常最终发生的事情是有人出现并需要特定的东西,所以他们添加它并提交补丁。显然,您是第一个需要支持 XML 模式的人。
xmlSchemaNewDocParserCtxt 绑定为Xml.ParserCtxt.ParserCtxt.create_doc。其他两个函数目前没有绑定,虽然绑定它们不是很困难。向 libxml-2.0 VAPI 添加类似这样的内容(完全未经测试)应该可以解决问题:
[Compact]
[CCode (cname = "xmlSchema", free_function = "xmlSchemaFree", cheader_filename = "libxml/xmlschemas.h")]
public class Schema {
[CCode (cname = "xmlSchemaDump", instance_pos = -1)]
public void dump (GLib.FileStream output);
}
[Compact]
[CCode (cname = "xmlSchemaParserCtxt", free_function = "xmlSchemaFreeParserCtxt", cheader_filename = "libxml/xmlschemas.h")]
public class SchemaParserCtxt {
[CCode (cname = "xmlSchemaNewParserCtxt")]
public SchemaParserCtxt (string URL);
[CCode (cname = "xmlSchemaNewDocParserCtxt")]
public SchemaParserCtxt.from_doc (Xml.Doc doc);
[CCode (cname = "xmlSchemaNewMemParserCtxt")]
public SchemaParserCtxt.from_buffer (uint8[] buffer);
[CCode (cname = "xmlSchemaParse")]
public Xml.Schema parse ();
}
[Compact]
[CCode (cname = "xmlSchemaValidCtxt", free_function = "xmlSchemaFreeValidCtxt", cheader_filename = "libxml/xmlschemas.h")]
public class SchemaValidCtxt {
public SchemaValidCtxt (Xml.Schema schema);
}
我只能找到第三个,valadoc 中提到的 SchemaValidCtxt,但页面几乎是空白的。这是一个有效的可用类吗?
它现在只是一个空壳——没有任何方法是绑定的。幸运的是,添加绑定非常容易。