gpt4 book ai didi

c++ - 使用 Xerces 验证未定义模式的 XML

转载 作者:行者123 更新时间:2023-11-30 04:36:44 25 4
gpt4 key购买 nike

我正在使用 Xerces-C++(版本 2.6.1)SAX2 解析器来验证 XML,例如下面的文档。 (这是 MSML - 在 RFC 5707 中定义的媒体服务器标记语言。)

<?xml version="1.0" encoding="UTF-8"?>
<msml version="1.1">
<createconference name="example">
<audiomix>
<n-loudest n="3"/>
<asn ri="10s"/>
</audiomix>
</createconference>
</msml>

RFC 提供了 XML schemas for validating MSML ,并且我正在尝试将它们与 Xerces SAX2 解析器结合使用来验证和解析 MSML。解析工作正常,但我没有得到任何验证。我怀疑我的问题可能是因为我尝试验证的 MSML 不包含 schemaLocation 属性,但我无法控制我收到的 XML - 我想使用 msml 强制验证.xsd XML 中是否提供了 schemaLocationnoNamespaceSchemaLocation(或什么都不提供)。

我的代码类似于下面。

SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();

// Enable the parser's schema support
parser->setFeature(XMLUni::fgXercesSchema, true);

// Schema validation requires namespace processing to be turned on.
parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);

// Define the location of the MSML schema.
XMLCh* schemaLocation = XMLString::transcode("/directory/path/msml-core.xsd");
parser->setProperty(XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation,
schemaLocation);

// MSMLHandler is defined elsewhere and inherits from xercesc/sax2/DefaultHandler
// It overrides startElement and fatalError.
MxMSMLHandler* msmlHandler = new MSMLHandler(xiSessionID, xoMSMLResponse);
parser->setContentHandler((ContentHandler*) msmlHandler);
parser->setErrorHandler((ErrorHandler*) msmlHandler);

// Do the parse
parser->parse(*xmlInputSource);

最佳答案

经过多次反复试验和错误,我最终找到了问题所在。验证错误将报告给传递给解析器的 ErrorHandler 上的 error 回调。 schemaLocation 属性没有问题。

修复了这个问题,并添加了 XML 语法的缓存以提高性能,现在的代码如下。

SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();

// Enable the parser's schema support
parser->setFeature(XMLUni::fgXercesSchema, true);

// Schema validation requires namespace processing to be turned on.
parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);

// Cache the XML grammar and use it for subsequent parses.
mParser->setFeature(XMLUni::fgXercesCacheGrammarFromParse, true);
mParser->setFeature(XMLUni::fgXercesUseCachedGrammarInParse, true);

// Define the location of the MSML schema.
XMLCh* schemaLocation = XMLString::transcode("/directory/path/msml-core.xsd");
parser->setProperty(XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation,
schemaLocation);

// MSMLHandler is defined elsewhere and inherits from xercesc/sax2/DefaultHandler
// It overrides startElement, fatalError *and error*.
MxMSMLHandler* msmlHandler = new MSMLHandler(xiSessionID, xoMSMLResponse);
parser->setContentHandler((ContentHandler*) msmlHandler);
parser->setErrorHandler((ErrorHandler*) msmlHandler);

// Do the parse
parser->parse(*xmlInputSource);

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

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