我用XML记录了一些敏感信息,因此打包到了一个较大的文件块中,并记录下了XML文件块部分的具体位置和大小.想在读取时候,先把包含XML的大文件块读到内存,然后寻找到XML开始的地方,创建XML.这样可行吗?
我用的是 tinyXML,不知道是否支持.
有支持这样用法的XML库吗?

解决方案 »

  1.   

    能具体说一下吗?用哪个API
    谢谢
      

  2.   

    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
      

  3.   

    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);
      

  4.   

    LS用的是MSXML吧tinyxml的LoadFile是从文件中读XML
    LoadFile也是先把文件读到内存中 然后分析
    如果tinyxml没有提供直接从内存中读XML的方法
    但它提供给你了源码
    LoadFile中读文件到内存以后的代码不就是你需要的了
      

  5.   

    LoadFile把文件读到内存中 然后分析,你自己的XML格式,自己知道,根据格式生成XML.用的都是tinyxml类中的函数,其实那些函数不是很多(重载了一堆),知道了那些函数的含义就好办了.tinyxml类提供了一系列的方法,具体还要你自己去灵活运用.
      

  6.   

    文件的载入功能实现
    数据结构中是两个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;
      

  7.   

    谢谢,已经找到,tinyXml 可以的,直接用 TiXmlDocument::Parse(...),就可以了,