怎样从内存块中创建XML? 我用XML记录了一些敏感信息,因此打包到了一个较大的文件块中,并记录下了XML文件块部分的具体位置和大小.想在读取时候,先把包含XML的大文件块读到内存,然后寻找到XML开始的地方,创建XML.这样可行吗?我用的是 tinyXML,不知道是否支持.有支持这样用法的XML库吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 能具体说一下吗?用哪个API谢谢 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是从文件中读XMLLoadFile也是先把文件读到内存中 然后分析如果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(...),就可以了, OpenGL贝塞尔曲面添加光照后不起作用 关于EXCEL进程问题! 请问怎么去掉窗口的标题栏 为何GetprocAddress得不到函数的地址? 在VC中如何调用文件的默认程序,打开该文件 vc 画图程序问题 多练练英语水平对你也有好处:) 请教:MFC SOCKET和WINSOCK2混用的问题? 组件(COM)的小问题,请帮忙!! 函数问题 在Vista下如何调用文件Copy的对话框,IFileOperation相关 小问题
谢谢
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);
LoadFile也是先把文件读到内存中 然后分析
如果tinyxml没有提供直接从内存中读XML的方法
但它提供给你了源码
LoadFile中读文件到内存以后的代码不就是你需要的了
数据结构中是两个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;