请教:如何使IXMLDOMDocument->save保存的XML文件能够自动缩进

ATField 2004-03-12 09:12:10
我在使用IXMLDOMDocument->save方法时,保存的XML文件看起来如下:
<?xml version="1.0">
<!-- -->
<Root><Child1><Child2></Child2></Child1></Root>
我想让保存的XML文件能够自动缩进,即:
<root>
<Child1>
<Child2>
</Child2>
<Child1>
</root>
(不知道CSDN能不能把上面的显示对)
我希望能够使用MSXML中的类来完成这件事。如果直接操作文本文件可是可以,就是过于复杂。我看过IXMLDOMDocument的成员,没有提供这样的方法。
请指教。
...全文
369 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2004-03-22
  • 打赏
  • 举报
回复
讨论链接
问起过好多次的问题了,手头正好在做XML的生成,就写了一下
其实,缩进和换行就是文本,在需要的位置创建文本节点就可以了。另外一个方法就是用SAX来写

<Message Date="1/11/2004" Time="4:23:07 PM" DateTime="1/11/2004 4:23:07 PM" SessionID="1">
<From>
<User LogonName="user1@somesite.com" FriendlyName="user1"/>
</From>
<To>
<User LogonName="user2@somesite.com" FriendlyName="user2"/>
</To>
<Text Style="font-size:9pt"></Text>
</Message>

可以这么写出来
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"));
//<Message>element
//date property
//time property
//datetime property
//SessionID property
// <From> element
// <User>element
// LogonName property
// FriendlyName property
// <To>
// <User>element
// LogonName property
// FriendlyName property
// <Text>element
// Style property
//<Invitation> element
//date property
//time property
//datetime property
//SessionID property
// <From> element
// <User>element
// LogonName property
// FriendlyName property
// <Application>element
// <Text>element
// Style property
//<InvitationResponse>element
//date property
//time property
//datetime property
//SessionID property
// <From> element
// <User>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);
}
joycenter 2004-03-22
  • 打赏
  • 举报
回复
上面的文章链接看不到了, 能否把原文贴出来?

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧