xml文件的读写

使用微软提供的库

1.安装msxml4.msi

2.头文件包含#import  <msxml4.dll>

3.xml的读写

// 写入xml

bool CXml::Write(const CFODrawShapeSet* pShapeList, const CString strFilePath)
{
 MSXML2::IXMLDOMDocumentPtr pDoc = NULL;
 MSXML2::IXMLDOMElementPtr pRoot = NULL;       // 根节点
 MSXML2::IXMLDOMElementPtr pSubRootShape = NULL;     // 子根节点-基本shape
 MSXML2::IXMLDOMElementPtr pSubRootLinkShape = NULL;    // 子根节点-连接线
 MSXML2::IXMLDOMElementPtr pSubRootTurnCornerLinkShape = NULL; // 子根节点-折线
 MSXML2::IXMLDOMElementPtr pSubRootText = NULL;     // 子根节点-文本

 // 1. 创建DOMDocument对象
 HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument));
 if ( !SUCCEEDED(hr))
 {
  AfxMessageBox( " 无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库! " );
  return false;
 }

 // 2. 创建xml文档声明
 MSXML2::IXMLDOMProcessingInstructionPtr pProInstruction;
 pProInstruction = pDoc->createProcessingInstruction((_bstr_t)(char*)"xml", (_bstr_t)(char*)"version=\"1.0\" encoding=\"utf-8\"");
 pDoc->appendChild(pProInstruction);

 // 3. 创建根节点、子根节点
 pRoot = pDoc->createElement((_bstr_t)"Shapes");
 pDoc->appendChild(pRoot);
 pSubRootShape = pDoc->createElement((_bstr_t)"Shape");
 pRoot->appendChild(pSubRootShape);
 pSubRootLinkShape = pDoc->createElement((_bstr_t)"LinkShape");
 pRoot->appendChild(pSubRootLinkShape);
 pSubRootTurnCornerLinkShape = pDoc->createElement((_bstr_t)"TurnCornerLinkShape");
 pRoot->appendChild(pSubRootTurnCornerLinkShape);
 pSubRootText = pDoc->createElement((_bstr_t)"Text");
 pRoot->appendChild(pSubRootText);

 // 4. 添加子节点
 // 节点计数
 int nShapeCount = 0;
 int nLinkShapeCount = 0;
 int nTurnCornerLinkShapeCount = 0; 
 int nTextCount = 0;
 // 根据不同的节点类型记录数据
 for (int i = 0; i < pShapeList->GetCount(); ++i)
 {
  CFODrawShape* pDrawShape = (CFODrawShape*)pShapeList->GetObject(i);
  MSXML2::IXMLDOMElementPtr pTemp = NULL;

  // 类型
  int nType = pDrawShape->GetType();
  switch(nType)
  {
  case 2:     // Text
   {
    CFOStaticShape* pStaticShape = (CFOStaticShape*)pDrawShape;

    // 4.1.1 索引
    CString strIndex;
    strIndex.Format(_T("Index%d"), nTextCount++);
    pTemp = pDoc->createElement((_bstr_t)strIndex);

    // 4.1.2 链表中的位置
    //pTemp->setAttribute((_bstr_t)"LinkIndex", i);
    _variant_t vtVal;
    vtVal.vt = VT_I4;
    vtVal.intVal = i;
    pTemp->setAttribute((_bstr_t)"LinkIndex", vtVal);

    // 4.1.3 标题和类型
    //pTemp->setAttribute((_bstr_t)"Type", nType);
    vtVal.intVal = nType;
    pTemp->setAttribute((_bstr_t)"Type", vtVal);
    pTemp->setAttribute((_bstr_t)"LinkIndex", vtVal);
    pTemp->setAttribute((_bstr_t)"Caption", (const char*)pStaticShape->GetObjectCaption());

    // 4.1.4 坐标
    CPoint point = pStaticShape->GetCenterPoint();
    pTemp->setAttribute((_bstr_t)"X", point.x);
    pTemp->setAttribute((_bstr_t)"Y", point.y);

    // 4.1.5 宽高(大小)
    CRect rect = pStaticShape->GetDrawRect();
    pTemp->setAttribute((_bstr_t)"Width",  rect.right - rect.left);
    pTemp->setAttribute((_bstr_t)"Height", rect.bottom - rect.top);

    // 4.1.6 关联ID
    long lRelateID;
    if (pStaticShape->GetPropDWordValue(lRelateID, FO_EXT_RETEXT_PROP_ID))
     pTemp->setAttribute((_bstr_t)"RelateID", lRelateID);
    else
    {
     //pTemp->setAttribute((_bstr_t)"RelateID", -1);
     _variant_t vtVal;
     vtVal.vt = VT_I4;
     vtVal.intVal = -1;
     pTemp->setAttribute((_bstr_t)"RelateID", vtVal);
    }

    pSubRootText->appendChild(pTemp);
   }
   break;
  case 91:    // LinkShape
  case 208:    // TurnCornerLinkShape 折线
   {
    CFOLinkShape* pLinkShape = (CFOLinkShape*)pDrawShape;

    // 4.2.1 索引
    if (pLinkShape->IsKindOf(RUNTIME_CLASS(CFOTurnCornerLinkShape)))
    {
     CString strIndex;
     strIndex.Format(_T("Index%d"), nTurnCornerLinkShapeCount++);
     pTemp = pDoc->createElement((_bstr_t)strIndex);
    }
    else
    {
     CString strIndex;
     strIndex.Format(_T("Index%d"), nLinkShapeCount++);
     pTemp = pDoc->createElement((_bstr_t)strIndex);
    }

    // 4.1.2 链表中的位置
    //pTemp->setAttribute((_bstr_t)"LinkIndex", i);
    _variant_t vtVal;
    vtVal.vt = VT_I4;
    vtVal.intVal = i;
    pTemp->setAttribute((_bstr_t)"LinkIndex", vtVal);

    // 4.2.3 标题和类型
    //pTemp->setAttribute((_bstr_t)"Type", nType);
    vtVal.intVal = nType;
    pTemp->setAttribute((_bstr_t)"Type", vtVal);
    pTemp->setAttribute((_bstr_t)"Caption", (const char*)pLinkShape->GetObjectCaption());

    // 4.2.4 坐标
    CPoint point = pLinkShape->GetCenterPoint();
    pTemp->setAttribute((_bstr_t)"X", point.x);
    pTemp->setAttribute((_bstr_t)"Y", point.y);

    // 4.2.5 连接Shape坐标
    // FromPort
    if (pLinkShape->GetFromPort() != NULL)
    {
     //pTemp->setAttribute((_bstr_t)"StartShapeID", pLinkShape->GetFromPort()->GetParentComp()->GetIndexForLink());
     _variant_t vtVal;
     vtVal.vt = VT_I4;
     vtVal.intVal = pLinkShape->GetFromPort()->GetParentComp()->GetIndexForLink();
     pTemp->setAttribute((_bstr_t)"StartShapeID", vtVal);
     //pTemp->setAttribute((_bstr_t)"StartPortID", pLinkShape->GetFromPort()->GetIndexForLink());
     vtVal.intVal = pLinkShape->GetFromPort()->GetIndexForLink();
     pTemp->setAttribute((_bstr_t)"StartPortID", vtVal);
    }
    else
    {
     pTemp->setAttribute((_bstr_t)"StartShapeID", "-1");
     pTemp->setAttribute((_bstr_t)"StartPortID", "-1");
    }
    // ToPort
    if (pLinkShape->GetToPort() != NULL)
    {
     //pTemp->setAttribute((_bstr_t)"EndShapeID", pLinkShape->GetToPort()->GetParentComp()->GetIndexForLink());
     _variant_t vtVal;
     vtVal.vt = VT_I4;
     vtVal.intVal = pLinkShape->GetToPort()->GetParentComp()->GetIndexForLink();
     pTemp->setAttribute((_bstr_t)"EndShapeID", vtVal);
     //pTemp->setAttribute((_bstr_t)"EndPortID", pLinkShape->GetToPort()->GetIndexForLink());
     vtVal.intVal = pLinkShape->GetToPort()->GetIndexForLink();
     pTemp->setAttribute((_bstr_t)"EndShapeID", vtVal);
    }
    else
    {
     pTemp->setAttribute((_bstr_t)"EndShapeID", "-1");
     pTemp->setAttribute((_bstr_t)"EndPortID", "-1");
    }

    // 4.2.6 draw point
    {
     MSXML2::IXMLDOMElementPtr pSubRootSavePoint = NULL;   // 子根节点-SavePoint
     pSubRootSavePoint = pDoc->createElement((_bstr_t)"SavePoint");
     pTemp->appendChild(pSubRootSavePoint);

     int nPointCount = pLinkShape->GetPointCount();
     LPPOINT lPPoint = pLinkShape->GetPoints();
     CString strPoints;
     for (int j = 0; j < nPointCount; ++j)
     {
      CString strTemp;
      strTemp.Format(_T("%d,%d;"), lPPoint[j].x, lPPoint[j].y);
      strPoints += strTemp;
     }

     //pSubRootSavePoint->setAttribute((_bstr_t)"PointCount", nPointCount);
     _variant_t vtVal;
     vtVal.vt = VT_I4;
     vtVal.intVal = nPointCount;
     pSubRootSavePoint->setAttribute((_bstr_t)"PointCount", vtVal);
     //pSubRootSavePoint->setAttribute((_bstr_t)"Points", (const char*)strPoints);
     _variant_t vtVal1;
     vtVal1.vt = VT_BSTR;
     vtVal1.bstrVal = strPoints.AllocSysString();
     pSubRootSavePoint->setAttribute((_bstr_t)"Points", vtVal1);
    }

    if (pLinkShape->IsKindOf(RUNTIME_CLASS(CFOTurnCornerLinkShape)))
     pSubRootTurnCornerLinkShape->appendChild(pTemp);
    else
     pSubRootLinkShape->appendChild(pTemp);
   }
   break;
  default:
   if (nType >= 1000) // Shape
   {
    // 4.3.1 索引
    CString strIndex;
    strIndex.Format(_T("Index%d"), nShapeCount++);
    pTemp = pDoc->createElement((_bstr_t)strIndex);

    // 4.1.2 链表中的位置
    //pTemp->setAttribute((_bstr_t)"LinkIndex", i);
    _variant_t vtVal;
    vtVal.vt = VT_I4;
    vtVal.intVal = i;
    pTemp->setAttribute((_bstr_t)"LinkIndex", vtVal);

    // 4.3.3 标题和类型
    //pTemp->setAttribute((_bstr_t)"Type", nType);
    vtVal.intVal = nType;
    pTemp->setAttribute((_bstr_t)"Type", vtVal);
    pTemp->setAttribute((_bstr_t)"Caption", (const char*)pDrawShape->GetObjectCaption());

    // 4.3.4 坐标
    CPoint point = pDrawShape->GetCenterPoint();
    pTemp->setAttribute((_bstr_t)"X", point.x);
    pTemp->setAttribute((_bstr_t)"Y", point.y);

    // 4.1.6 关联ID
    long lRelateID;
    if (pDrawShape->GetPropDWordValue(lRelateID, FO_EXT_RETEXT_PROP_ID))
     pTemp->setAttribute((_bstr_t)"RelateID", lRelateID);
    else
    {
     //pTemp->setAttribute((_bstr_t)"RelateID", -1);
     _variant_t vtVal;
     vtVal.vt = VT_I4;
     vtVal.intVal = -1;
     pTemp->setAttribute((_bstr_t)"RelateID", vtVal);
    }

    pSubRootShape->appendChild(pTemp);
   }
   break;
  }
 }

 pDoc->save((LPCTSTR)strFilePath);
 return true;
}

bool CXml::Read(UCCDrawDataModel* pDataModel, const CMyToolBoxWnd* pMyWndTool, const CString strFilePath)
{
 MSXML2::IXMLDOMDocumentPtr pDoc = NULL;
 MSXML2::IXMLDOMNodeListPtr pList = NULL;
 MSXML2::IXMLDOMNodePtr pRoot = NULL;

 MSXML2::IXMLDOMNodePtr pNode = NULL;
 MSXML2::IXMLDOMNamedNodeMapPtr pMapAttribute = NULL; // 属性

 // 1. 创建com对象
 HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument));
 if (FAILED(hr))
 {
  AfxMessageBox("无法创建DOMDocument40对象,请检查是否安装并初始化了MsXml Parser库!");
  return false;
 }

 // 2. 加载xml文件
 if (!pDoc->load((_variant_t)(LPCTSTR)strFilePath)) // 加载失败
 {
  AfxMessageBox("文件加载失败!");
  return false;
 }

 // 3. 根节点
 pRoot = pDoc->GetdocumentElement();

 // 4. 读取节点值
 // 4.1 Shape节点
 pNode = pRoot->selectSingleNode((_bstr_t)"Shape");
 pList = pNode->GetchildNodes();
 for (int i = 0; i < pList->Getlength(); ++i)
 {
  MSXML2::IXMLDOMElementPtr pElement = pList->Getitem(i);
  MSXML2::IXMLDOMAttributePtr pNodeTemp;

  // 记录属性值
  struct_shape shape;
  pNodeTemp = pElement->getAttributeNode("LinkIndex");
  shape.nLinkIndex = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("Type");
  shape.nType = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("Caption");
  shape.strCaption = pNodeTemp->GetnodeValue().bstrVal;

  pNodeTemp = pElement->getAttributeNode("X");
  shape.nX = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("Y");
  shape.nY = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("RelateID");
  shape.lRelateID = atol(CString(pNodeTemp->GetnodeValue().bstrVal));

  m_shapes.arrShape.push_back(shape);
 }

 // 4.2 LinkShape节点
 pNode = pRoot->selectSingleNode((_bstr_t)"LinkShape");
 pList = pNode->GetchildNodes();
 for (int k = 0; k < pList->Getlength(); ++k)
 {
  MSXML2::IXMLDOMElementPtr pElement = pList->Getitem(k);
  MSXML2::IXMLDOMAttributePtr pNodeTemp;

  // 记录属性值
  struct_link linkShape;
  pNodeTemp = pElement->getAttributeNode("LinkIndex");
  linkShape.nLinkIndex = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("Type");
  linkShape.nType = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("Caption");
  linkShape.strCaption = pNodeTemp->GetnodeValue().bstrVal;

  pNodeTemp = pElement->getAttributeNode("X");
  linkShape.nX = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("Y");
  linkShape.nY = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("StartShapeID");
  linkShape.nStartShapeID = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("StartPortID");
  linkShape.nStartPortID = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("EndShapeID");
  linkShape.nEndShapeID = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("EndPortID");
  linkShape.nEndPortID = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  // SavePoint
  {
   MSXML2::IXMLDOMElementPtr pSavePointElement = NULL;
   pSavePointElement = pElement->selectSingleNode("SavePoint");

   pNodeTemp = pSavePointElement->getAttributeNode("PointCount");
   int nPointCount = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

   pNodeTemp = pSavePointElement->getAttributeNode("Points");
   CString strPoints = CString(pNodeTemp->GetnodeValue().bstrVal);

   for (int j = 0; j < nPointCount; ++j)
   {
    CString strTemp = strPoints.Left(strPoints.Find(";"));
    strPoints = strPoints.Right(strPoints.GetLength() - strPoints.Find(";") - 1);
    
    CPoint point;
    sscanf(strTemp, "%d,%d", &point.x, &point.y);

    linkShape.arrSavePoint.push_back(point);
   }
  }

  m_shapes.arrLinkShape.push_back(linkShape);
 }

 // 4.3 TurnCornerLinkShape节点
 pNode = pRoot->selectSingleNode((_bstr_t)"TurnCornerLinkShape");
 pList = pNode->GetchildNodes();
 for (int m = 0; m < pList->Getlength(); ++m)
 {
  MSXML2::IXMLDOMElementPtr pElement = pList->Getitem(m);
  MSXML2::IXMLDOMAttributePtr pNodeTemp;

  // 记录属性值
  struct_link turnCornerLinkShape;
  pNodeTemp = pElement->getAttributeNode("LinkIndex");
  turnCornerLinkShape.nLinkIndex = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("Type");
  turnCornerLinkShape.nType = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("Caption");
  turnCornerLinkShape.strCaption = pNodeTemp->GetnodeValue().bstrVal;

  pNodeTemp = pElement->getAttributeNode("X");
  turnCornerLinkShape.nX = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("Y");
  turnCornerLinkShape.nY = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("StartShapeID");
  turnCornerLinkShape.nStartShapeID = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("StartPortID");
  turnCornerLinkShape.nStartPortID = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("EndShapeID");
  turnCornerLinkShape.nEndShapeID = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("EndPortID");
  turnCornerLinkShape.nEndPortID = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  // SavePoint
  {
   MSXML2::IXMLDOMElementPtr pSavePointElement = NULL;
   pSavePointElement = pElement->selectSingleNode("SavePoint");

   pNodeTemp = pSavePointElement->getAttributeNode("PointCount");
   int nPointCount = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

   pNodeTemp = pSavePointElement->getAttributeNode("Points");
   CString strPoints = CString(pNodeTemp->GetnodeValue().bstrVal);

   for (int j = 0; j < nPointCount; ++j)
   {
    CString strTemp = strPoints.Left(strPoints.Find(";"));
    strPoints = strPoints.Right(strPoints.GetLength() - strPoints.Find(";") - 1);

    CPoint point;
    sscanf(strTemp, "%d,%d", &point.x, &point.y);

    turnCornerLinkShape.arrSavePoint.push_back(point);
   }
  }

  m_shapes.arrTurnCornerLinkShape.push_back(turnCornerLinkShape);
 }

 // 4.4 Text节点
 pNode = pRoot->selectSingleNode((_bstr_t)"Text");
 pList = pNode->GetchildNodes();
 for (int n = 0; n < pList->Getlength(); ++n)
 {
  MSXML2::IXMLDOMElementPtr pElement = pList->Getitem(n);
  MSXML2::IXMLDOMAttributePtr pNodeTemp;

  // 记录属性值
  struct_text text;
  pNodeTemp = pElement->getAttributeNode("LinkIndex");
  text.nLinkIndex = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("Type");
  text.nType = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("Caption");
  text.strCaption = pNodeTemp->GetnodeValue().bstrVal;

  pNodeTemp = pElement->getAttributeNode("X");
  text.nX = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("Y");
  text.nY = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("Width");
  text.nWidth = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("Height");
  text.nHeight = atoi(CString(pNodeTemp->GetnodeValue().bstrVal));

  pNodeTemp = pElement->getAttributeNode("RelateID");
  text.lRelateID = atol(CString(pNodeTemp->GetnodeValue().bstrVal));

  m_shapes.arrText.push_back(text);
 }

  return true;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值