C++ 分段读取 XML 个文件
C++ read XML files in pieces
我正在使用 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 parsing" 方法,该方法甚至可以在无尽的 XML 流上运行。您只需要存储 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 parsing" 方法,该方法甚至可以在无尽的 XML 流上运行。您只需要存储 XML 个您感兴趣的摘录,而忽略其余部分。