我正在编写一个简单的C ++程序来解析XML文件以检查它是否格式正确,以及它是否对提供的模式有效。根据软件主管的限制,我限制使用Libxml ++。
我让一切正常,现在尝试处理错误处理,以便返回更有意义的错误消息。在解析错误时,这已经为我完成了,因为它返回解析问题发生的行号和列号。但是,对于有效性异常,它只是说明了有效性错误被捕获的元素以及关于错误的短消息。
是否可以对其进行修改,使其也返回遇到的行号和列号?问题是,如果针对非唯一的元素捕获到有效性错误,那么如果XML文件长达数千行,则找到它将是无关紧要的。
我使用DomParser解析XML,并使用libxml ++中的SchemaValidator类
答案 0 :(得分:1)
据我所知, libxml ++ 是不可能的,但你可以直接使用底层的 libxml2 函数。关键是使用xmlSchemaSetValidStructuredErrors注册结构化错误处理程序。错误处理程序接收xmlError,其中包含行号和列号的字段。该列存储在int2
中。请参阅以下示例程序:
#include <stdio.h>
#include <libxml/xmlschemas.h>
void errorHandler(void *userData, xmlErrorPtr error) {
printf("Error at line %d, column %d\n%s",
error->line, error->int2, error->message);
}
int main() {
xmlSchemaParserCtxtPtr pctxt = xmlSchemaNewParserCtxt("so.xsd");
xmlSchemaPtr schema = xmlSchemaParse(pctxt);
xmlSchemaValidCtxtPtr vctxt = xmlSchemaNewValidCtxt(schema);
xmlSchemaSetValidStructuredErrors(vctxt, errorHandler, NULL);
xmlSchemaValidateFile(vctxt, "so.xml", 0);
return 0;
}
给定架构so.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="doc">
<xs:complexType>
<xs:sequence>
<xs:element name="item" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="attr" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="uniq">
<xs:selector xpath="item"/>
<xs:field xpath="@attr"/>
</xs:unique>
</xs:element>
</xs:schema>
和文件so.xml
<doc>
<item attr="one"/>
<item attr="two"/>
<item attr="three"/>
<item attr="one"/>
</doc>
程序打印
Error at line 5, column 23
Element 'item': Duplicate key-sequence ['one'] in unique identity-constraint 'uniq'.