我正在尝试调试代码中似乎是XML解析问题的内容。我已将其分离到以下代码段:
HRESULT
CXmlDocument::Load(IStream* Stream)
{
CComVariant xmlSource(static_cast<IUnknown*>(Stream));
VARIANT_BOOL isSuccessful;
* HRESULT hr = m_pXmlDoc->load(xmlSource, &isSuccessful);
return (hr == S_FALSE) ? E_FAIL : hr;
}
注意: m_pXmlDoc
属于CComPtr<IXMLDOMDocument>
类型。
IXMLDOMDocument::load()
(标有*)的调用似乎失败了 - IOW,它正在返回S_FALSE
。
我无法进入load()
来确定它失败的原因,因为它是一个COM调用。
这种方法的MSDN page似乎没有提供很多见解。
我有几个预感:
关于为什么这个电话会失败的任何想法?
答案 0 :(得分:10)
以下代码将从DOM中获取特定的解析器错误及其在源XML中的位置。
CComPtr<IXMLDOMParseError> pError;
CComBSTR sReason, sSource;
long nLine = 0, nColumn = 0;
m_pXmlDoc->get_parseError(&pError);
if(pError)
{
pError->get_reason(&sReason);
pError->get_srcText(&sSource);
pError->get_line(&nLine);
pError->get_linepos(&nColumn);
}
sReason
将填充错误消息。 sSource
将包含XML中的错误源代码行。 nLine
和nColumn
应设置为错误的行号和列,但实际上这两个并不总是可靠地设置(iirc,尤其是验证错误,而不是解析器/良好的形式)。
答案 1 :(得分:0)
如果XML文件由另一个Task打开,或者使用Load()方法 无法加载文件但它没有说明加载失败。 我认为这种行为是一个错误。
所以你必须检查Property documentElement - 如果它是null,load()也失败了。