gpt4 book ai didi

c++ - libxml++ : Returning Line/Column number upon validity errors

转载 作者:行者123 更新时间:2023-11-30 05:27:39 25 4
gpt4 key购买 nike

我正在编写一个简单的 C++ 程序来解析 XML 文件,以检查它的格式是否正确,以及它是否对提供的模式有效。根据软件负责人的限制,我只能使用 Libxml++。

我让一切正常,现在尝试处理错误,以便它返回更有意义的错误消息。在解析错误中,这已经为我完成了,因为它返回发生解析问题的行号和列号。但是,对于有效性异常,它仅说明捕获到有效性错误的元素以及有关错误内容的简短消息。

是否可以修改它,使其也返回遇到的行号和列号?问题是,如果针对非唯一元素捕获了有效性错误,如果 XML 文件有数千行长,则很难找到它。

我使用 DomParser 解析 XML,并使用 libxml++ 中的 SchemaValidator 类

最佳答案

据我所知,这对于 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'.

关于c++ - libxml++ : Returning Line/Column number upon validity errors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37164353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com