作者:书友30905431 | 来源:互联网 | 2023-09-11 11:52
我用XML记录了一些敏感信息,因此打包到了一个较大的文件块中,并记录下了XML文件块部分的具体位置和大小.想在读取时候,先把包含XML的大文件块读到内存,然后寻找到XML开始的地方,创建XML.这样可
我用XML记录了一些敏感信息,因此打包到了一个较大的文件块中,并记录下了XML文件块部分的具体位置和大小.想在读取时候,先把包含XML的大文件块读到内存,然后寻找到XML开始的地方,创建XML.这样可行吗?
我用的是 tinyXML,不知道是否支持.
有支持这样用法的XML库吗?
9 个解决方案
http://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/29602http://topic.csdn.net/t/20040413/16/2960207.html07.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.htmlhttp://topic.csdn.net/t/20040413/16/2960207.html
MSXML2::IXMLDOMDocumentPtr pXmlDom;
MSXML2::IXMLDOMElementPtr xmlRoot;
CComBSTR rootname;
MSXML2::IXMLDOMNodeListPtr pNodeList;
MSXML2::IXMLDOMNodePtr pNode;
CoInitialize(NULL);
// TODO: Add extra validation here
HRESULT hr=CoCreateInstance(__uuidof(MSXML2::DOMDocument40),NULL,CLSCTX_INPROC_SERVER,
__uuidof(MSXML2::IXMLDOMDocument),(void**)&pXmlDom);
if(!SUCCEEDED(hr))
{
::MessageBox(NULL, "无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!", "error", MB_OK);
return -1;
}
pXmlDom->put_async(VARIANT_FALSE);
pXmlDom->put_validateOnParse(VARIANT_FALSE);
pXmlDom->put_resolveExternals(VARIANT_FALSE);
pXmlDom->load((_variant_t)str);
LS用的是MSXML吧
tinyxml的LoadFile是从文件中读XML
LoadFile也是先把文件读到内存中 然后分析
如果tinyxml没有提供直接从内存中读XML的方法
但它提供给你了源码
LoadFile中读文件到内存以后的代码不就是你需要的了
LoadFile把文件读到内存中 然后分析,你自己的XML格式,自己知道,根据格式生成XML.用的都是tinyxml类中的函数,其实那些函数不是很多(重载了一堆),知道了那些函数的含义就好办了.
tinyxml类提供了一系列的方法,具体还要你自己去灵活运用.
文件的载入功能实现
数据结构中是两个record数组的嵌套,我们采用for循环来实现。这里给出核心代码,如下:
procedure loadTemplate(filename: string);
// 读取模版文件的代码
var
xmlRootNode ,xmlRootNode2, xmlNode1, xmlNode2, xmlTmpNode: IXMLNode;
intIndex1 , intIndex2 : integer;
begin
myXMLDocument:=TXMLDocument.Create(nil);
myXMLDocument.LoadFromFile(filename);//加载模版文件
myXMLDocument.Active:=true;
try
//获取xml格式文件的根节点
xmlRootNode := myXMLDocument.DocumentElement;
//实现xml的遍历
for intIndex1 :=0 to 9 do
//实现第一层遍历,将第一层数据恢复到内存
begin
//用xmlNode1保存xml格式文件第一层的当前节点
xmlNode1 := xmlRootNode.ChildNodes.Get(intIndex1);
xmlTmpNode := xmlNode1.ChildNodes.Get(0);
logTemplate[intIndex1].ifUsed := StrToBool(xmlTmpNode.Text);
xmlTmpNode := xmlNode1.ChildNodes.Get(1);
logTemplate[intIndex1].left := StrToInt(xmlTmpNode.Text);
xmlTmpNode := xmlNode1.ChildNodes.Get(2);
logTemplate[intIndex1].width :=StrToInt(xmlTmpNode.Text);
xmlTmpNode := xmlNode1.ChildNodes.Get(3);
logTemplate[intIndex1].isLinear :=StrToBool(xmlTmpNode.Text);
//获取xml格式文件第二层数据的父节点
xmlRootNode2 := xmlNode1.ChildNodes.Get(4);
//实现第二层遍历,将第二层数据恢复到内存
for intIndex2 := 0 to 3 do
begin
//用xmlNode2保存xml格式文件的第二层的当前节点
xmlNode2 := xmlRootNode2.ChildNodes.Get(intIndex2);
xmlTmpNode := xmlNode2.ChildNodes.Get(0);
logTemplate[intIndex1].arrCurveAtt[intIndex2].ifUsed :=
StrToBool(xmlTmpNode.Text);
xmlTmpNode := xmlNode2.ChildNodes.Get(1);
logTemplate[intIndex1].arrCurveAtt[intIndex2].CurveCNName := xmlTmpNode.Text;
xmlTmpNode := xmlNode2.ChildNodes.Get(2);
logTemplate[intIndex1].arrCurveAtt[intIndex2].CurveENName := xmlTmpNode.Text;
xmlTmpNode := xmlNode2.ChildNodes.Get(3);
logTemplate[intIndex1].arrCurveAtt[intIndex2].CurveUnit := xmlTmpNode.Text;
xmlTmpNode := xmlNode2.ChildNodes.Get(4);
logTemplate[intIndex1].arrCurveAtt[intIndex2].max := StrToFloat(xmlTmpNode.Text);
xmlTmpNode := xmlNode2.ChildNodes.Get(5);
logTemplate[intIndex1].arrCurveAtt[intIndex2].min := StrToFloat(xmlTmpNode.Text);
xmlTmpNode := xmlNode2.ChildNodes.Get(6);
logTemplate[intIndex1].arrCurveAtt[intIndex2].linecolor :=
StringToColor(xmlTmpNode.Text);
xmlTmpNode := xmlNode2.ChildNodes.Get(7);
logTemplate[intIndex1].arrCurveAtt[intIndex2].lineStyle :=
TPenStyle(StrToInt(xmlTmpNode.Text));
xmlTmpNode := xmlNode2.ChildNodes.Get(8);
logTemplate[intIndex1].arrCurveAtt[intIndex2].lineThickness := StrToInt(xmlTmpNode.Text);
end;
end;
finally
//释放myXMLDocument
myXMLDocument:=nil;
end;
end;
谢谢,已经找到,tinyXml 可以的,直接用 TiXmlDocument::Parse(...),就可以了,