1/11/2004

让msxml4导出的文本xml缩进和换行

[url=http://expert.csdn.net/expert/Topicview2.asp?id=2637982]讨论链接[/url]
问起过好多次的问题了,手头正好在做XML的生成,就写了一下
其实,缩进和换行就是文本,在需要的位置创建文本节点就可以了。另外一个方法就是用SAX来写
[pre]










可以这么写出来
void CChatEditDlg::SendContent(BSTR bstrContent)
{
CHARFORMAT2& rcf=m_wndSend.GetCharFormatSelection();
CComBSTR bstrXML;
USES_CONVERSION;

try{
IXMLDOMDocument2Ptr pDoc;
IXMLDOMProcessingInstructionPtr pProcessingInstruction;
IXMLDOMElementPtr pLog,pMessage;
IXMLDOMElementPtr pFrom,pTo;
IXMLDOMElementPtr pUser;
IXMLDOMElementPtr pText;

HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
if(pDoc){
pDoc->async = false;
pDoc->resolveExternals = false;
pDoc->validateOnParse = true;
}
//pProcessingInstruction=pDoc->createProcessingInstruction(_T("xml"),
// _T("version=''1.0'' encoding=''UTF-16''"));
//pDoc->appendChild(pProcessingInstruction);
///Log
pLog=pDoc->createElement(_T("Log"));
hr=pDoc->appendChild(pLog);
AppendTextNode(pDoc,pLog,_T("\r\n\t"));
///Log/Message
pMessage=pDoc->createElement(_T("Message"));
hr=pLog->appendChild(pMessage);
AppendTextNode(pDoc,pMessage,_T("\r\n\t"));

COleDateTime t=COleDateTime::GetCurrentTime();
COleDateTime td=t;
td.m_dt=(int)td.m_dt;
COleDateTime tt=t-td;
///Log/Message/@Date
pMessage->setAttribute(L"Date",COleVariant(td));
///Log/Message/@Time
pMessage->setAttribute(L"Time",COleVariant(tt));
///Log/Message/@DateTime
pMessage->setAttribute(L"DateTime",COleVariant(t));
///Log/Message/@SessionID
pMessage->setAttribute(L"SessionID",(long)1);
///Log/Message/From
pFrom=pDoc->createElement(_T("From"));
hr=pMessage->appendChild(pFrom);
AppendTextNode(pDoc,pFrom,_T("\r\n\t\t"));
///Log/Message/From/User
pUser=pDoc->createElement(_T("User"));
hr=pFrom->appendChild(pUser);
//AppendTextNode(pDoc,pUser,_T("\r\n\t\t"));
AppendTextNode(pDoc,pFrom,_T("\r\n\t"));
AppendTextNode(pDoc,pMessage,_T("\r\n\t"));
///Log/Message/From/User/@LogonName
pUser->setAttribute(L"LogonName" ,_T("user1@somesite.com"));
///Log/Message/From/User/@FriendlyName
pUser->setAttribute(L"FriendlyName" ,_T("user1"));
///Log/Message/To
pTo=pDoc->createElement(_T("To"));
hr=pMessage->appendChild(pTo);
AppendTextNode(pDoc,pTo,_T("\r\n\t\t"));
///Log/Message/To/User
pUser=pDoc->createElement(_T("User"));
hr=pTo->appendChild(pUser);
///Log/Message/To/User/@LogonName
pUser->setAttribute(L"LogonName" ,_T("user2@somesite.com"));
///Log/Message/To/User/@FriendlyName
pUser->setAttribute(L"FriendlyName" ,_T("user2"));
AppendTextNode(pDoc,pTo,_T("\r\n\t"));
AppendTextNode(pDoc,pMessage,_T("\r\n\t"));
///Log/Message/Text
pText=pDoc->createElement(_T("Text"));
pText->put_text(bstrContent);
hr=pMessage->appendChild(pText);
pText->setAttribute(L"Style" ,(LPCTSTR)GetStyleAttrib(rcf));
AppendTextNode(pDoc,pMessage,_T("\r\n"));
//element
//date property
//time property
//datetime property
//SessionID property
// element
// element
// LogonName property
// FriendlyName property
//
// element
// LogonName property
// FriendlyName property
// element
// Style property
// element
//date property
//time property
//datetime property
//SessionID property
// element
// element
// LogonName property
// FriendlyName property
// element
// element
// Style property
//element
//date property
//time property
//datetime property
//SessionID property
// element
// element
// LogonName property
// FriendlyName property
pMessage->get_xml(&bstrXML);
TRACE(_T("%s\r\n"),OLE2T(bstrXML));
}
catch(...){
return ;
}
}
void CChatEditDlg::AppendTextNode(IXMLDOMDocument2Ptr pDoc
,IXMLDOMElementPtr pElement
,LPCTSTR lpszText)
{
IXMLDOMNodePtr pTextNode=pDoc->createTextNode(lpszText);
pElement->appendChild(pTextNode);
}[/pre]

No comments: