gpt4 book ai didi

c++ - 使用 XSD 的 Xerces XML 验证

转载 作者:行者123 更新时间:2023-11-30 01:54:26 24 4
gpt4 key购买 nike

我尝试使用给定的 XSD 语法文件验证 XML 文件。但现在它总是返回错误,提示 no declaration found for element ... 以及我在 XML 文件中的每个元素或属性。

为了创建 XSD,我使用了 Free online XSD generator如果我在同一站点上使用 (Validator)[http://www.freeformatter.com/xml-validator-xsd.html] 检查该 XSD 中的 xml,一切看起来都很好。

那么为什么 Xerces 会失败?

我使用下面的代码来验证:

      XercesDOMParser domParser;
if (domParser.loadGrammar(schemaFilePath.c_str(), Grammar::SchemaGrammarType) == NULL)
{
throw Except("couldn't load schema");
}

ParserErrorHandler parserErrorHandler;

domParser.setErrorHandler(&parserErrorHandler);
domParser.setValidationScheme(XercesDOMParser::Val_Always);
domParser.setDoNamespaces(true);
domParser.setDoSchema(true);
domParser.setValidationSchemaFullChecking(true);

domParser.parse(xmlFilePath.c_str());
if(domParser.getErrorCount() != 0)
{
throw Except("Invalid XML vs. XSD: " + parserErrorHandler.getErrors()); //merge a error coming from my interceptor ....
}

我的 XML 测试文件是:

<?xml version="1.0" encoding="UTF-8" ?>
<schemes signature="9fadde05">
<!-- NOTE: Do not modify this file.
Any modifications will invalidate the signature and result in an invalid file!
This is an example scheme, param_set etc... can be rename / market or / product
-->
<scheme>
<name>test1</name>
<other>test2</other>
</scheme>
<param_set>
<input>
<height min="1060" max="1100" />
<width min="1900" max="1940" />
</input>
</param_set>
</schemes>

我使用的 XSD 是:

<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="schemes">
<xs:complexType>
<xs:sequence>
<xs:element name="scheme">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:string" name="other"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="param_set">
<xs:complexType>
<xs:sequence>
<xs:element name="input">
<xs:complexType>
<xs:sequence>
<xs:element name="height">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:short" name="min"/>
<xs:attribute type="xs:short" name="max"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="width">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:short" name="min"/>
<xs:attribute type="xs:short" name="max"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:string" name="signature"/>
</xs:complexType>
</xs:element>
</xs:schema>

最佳答案

我用下面的代码解决了这个问题,我认为 setExternalNoNamespaceSchemaLocation 是诀窍。请注意,我还必须重建一个 absolute path对于 XSD。

    XMLPlatformUtils::Initialize();
{
XercesDOMParser domParser;
bfs::path pXSD = absolute(schemaFilePath);
if (domParser.loadGrammar(pXSD.string().c_str(), Grammar::SchemaGrammarType) == NULL)
{
throw Except("couldn't load schema");
}

ParserErrorHandler parserErrorHandler;

domParser.setErrorHandler(&parserErrorHandler);
domParser.setValidationScheme(XercesDOMParser::Val_Always);
domParser.setDoNamespaces(true);
domParser.setDoSchema(true);
domParser.setValidationSchemaFullChecking(true);

domParser.setExternalNoNamespaceSchemaLocation(pXSD.string().c_str());

domParser.parse(xmlFilePath.c_str());
if(domParser.getErrorCount() != 0)
{
throw Except("Invalid XML vs. XSD: " + parserErrorHandler.getErrors()); //merge a error coming from my interceptor ....
}
}
XMLPlatformUtils::Terminate();

关于c++ - 使用 XSD 的 Xerces XML 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22015661/

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