使用微软提供的库
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;
}