c++ - C++ 分段读取 XML 文件
问题描述
我正在使用 Visual C++ 对 MsXML6 库进行练习,以摆脱对 Python 等解释器语言分析大文件的依赖。我正在关注 msdn 上的教程,但是当将 XML 文件替换为更大的文件(超过 300MB)时,程序会显示错误,即无法找到该文件,并且后续变体为 NULL。
教程:https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms767609(v%3dvs.85)
HRESULT hr = S_OK;
IXMLDOMDocument *pXMLDom = NULL;
IXMLDOMNodeList *pNodes = NULL;
IXMLDOMNode *pNode = NULL;
BSTR bstrQuery1 = NULL;
BSTR bstrQuery2 = NULL;
BSTR bstrNodeName = NULL;
BSTR bstrNodeValue = NULL;
DOMNodeType DOMType;
VARIANT varNodeValue;
VARIANT_BOOL varStatus;
VARIANT varFileName;
VariantInit(&varFileName);
CHK_HR(CreateAndInitDOM(&pXMLDom));
CHK_HR(VariantFromString(L"TestDoc.xml", varFileName));
CHK_HR(pXMLDom->load(varFileName, &varStatus));
if (varStatus != VARIANT_TRUE)
{
CHK_HR(ReportParseError(pXMLDom, "Failed to load DOM from TestDoc.xml"));
initSuccessful = false;
}
else
{
//Assigns the DOM object as a member variable to be used in other methods
pXMLDomClassVar = pXMLDom;
initSuccessful = true;
}
我真的很感激这方面的一些帮助。
解决方案
在谈论 XML DOM 时,您应该认为这只是通过对该 XML 文件的全面分析而即时创建的内存数据库。由于巨大的内存消耗和低性能,通过 DOM 方法处理大型 XML 文件是一种非常糟糕的做法。(内容本身、索引和交叉链接等)即使是 10 Mb 的 XML DOM 在性能方面也是值得注意的,而且您的性能是它的 30 倍!
相反,在大型 XML 文件上,您应该使用“SAX 解析”方法,这种方法甚至可以在无穷无尽的 XML 流上运行。存储您感兴趣的 XML 摘录完全取决于您,而忽略其余部分。
推荐阅读
- laravel - 如何在 Laravel 中添加视频而不存储到数据库中
- python - 执行速度优化功能
- quasar - Quasar QTable 单击可单击行上的操作按钮
- amazon-web-services - Cloud Formation:S3 存储桶和 Lambda 的独立 cloudformation 模板
- c# - C# 将嵌套列表展平为不同对象的列表以在数据网格中显示
- python - python中的线程程序在IDLE上成功运行,但在shell、命令行上没有成功
- c++ - 从文本文件访问学生的分数
- firebase - 如何在 Flutter 中建立日反连续记录?
- vue.js - Vue JS单击事件未触发
- django-templates - 如何在我的模板 Django 中显示我需要的按钮?