如何将XML缩进显示?

timing 2004-12-24 11:55:59
只要把类似如下的xml
<?xml version="1.0" ?><Query AttrType="Query"><QueryFlag2 AttrType="String">5</QueryFlag2><QueryKey1 AttrType="String">1234</QueryKey1><QueryKey2 AttrType="String">38560041</QueryKey2></IntfQuery>
转换成下面格式就可以了
<?xml version="1.0" ?>
<IntfQuery AttrType="IntfQuery">
<QueryFlag2 AttrType="String">5</QueryFlag2>
<QueryKey1 AttrType="String">1234</QueryKey1>
<QueryKey2 AttrType="String">38560041</QueryKey2>
</IntfQuery>
我主要想让调试信息显示更友好一点。

用xslt可以吗?如果可以请给出xsl文件。
如果用代码,请给出源编码。

...全文
529 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuxianzhi 2005-01-18
  • 打赏
  • 举报
回复
自动缩进xml的代码,参考如下:

#include "stdafx.h"
#include <sstream>
#include <string>
#import "msxml4.dll" named_guids
using namespace MSXML2;
inline void linefeed(MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode)
{
pRootNode->appendChild(pXMLDoc->createTextNode("\n"));
}
inline void addTextElement(MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode,LPCTSTR value)
{
pRootNode->appendChild(pXMLDoc->createTextNode(value));
}
inline void addTabs(MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode,int tabcount)
{
std::ostringstream oss;
for(int i=0;i<tabcount;i++)
oss<<"\t";
addTextElement(pXMLDoc,pRootNode,oss.str().c_str());
}
void addfile(LPCTSTR filename,MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode,int tabcount)
{
MSXML2::IXMLDOMElementPtr pTempNode = NULL;

pTempNode = pXMLDoc->createElement(_T("file"));
linefeed(pXMLDoc,pTempNode);
addTabs(pXMLDoc,pTempNode,tabcount+1);
addTextElement(pXMLDoc,pTempNode,filename);
linefeed(pXMLDoc,pTempNode);
addTabs(pXMLDoc,pTempNode,tabcount);
addTabs(pXMLDoc,pRootNode,tabcount);
pRootNode->appendChild(pTempNode );
linefeed(pXMLDoc,pRootNode);
}
void savedir(LPCTSTR filename,MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode,int tabcount)
{
if ((GetFileAttributes(filename) & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
{
MSXML2::IXMLDOMNodePtr pDirNode= NULL;

addTabs(pXMLDoc,pRootNode,tabcount);
pDirNode = pRootNode->appendChild(pXMLDoc->createElement(_T("directory")));
// Step 6.3b: Creating RecID attribute for the Record element
MSXML2::IXMLDOMAttributePtr pRecIdAttr = NULL;
pRecIdAttr = pXMLDoc->createAttribute(_T("pathname"));
pRecIdAttr->nodeTypedValue = filename;
pDirNode->attributes->setNamedItem(pRecIdAttr);
linefeed(pXMLDoc,pDirNode);

WIN32_FIND_DATA wfd= {0};
char allname[MAX_PATH];
strcpy(allname,filename);
if(filename[strlen(filename)-1]!='\\')
strcat(allname,"\\*.*");
else
strcat(allname,"*.*");
HANDLE hFind = FindFirstFile(allname, &wfd);

if (hFind == INVALID_HANDLE_VALUE)
return ;
do
{
if(wfd.cFileName[0]=='.')
continue;
strcpy(allname,filename);
strcat(allname,"\\");
strcat(allname,wfd.cFileName);
if((GetFileAttributes(allname) & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
{
savedir(allname,pXMLDoc,pDirNode,tabcount+1);
}
else
{
addfile(wfd.cFileName,pXMLDoc,pDirNode,tabcount+1);
}
}while(FindNextFile(hFind, &wfd));
FindClose(hFind);
addTabs(pXMLDoc,pDirNode,tabcount);

addTabs(pXMLDoc,pRootNode,tabcount);
}
else
{
addfile(filename,pXMLDoc,pRootNode,tabcount);
}
linefeed(pXMLDoc,pRootNode);

}
void test()
{
MSXML2::IXMLDOMDocument2Ptr pXMLDoc = NULL;
MSXML2::IXMLDOMParseError *pParsingErr = NULL;
MSXML2::IXMLDOMElement *element = NULL;
MSXML2::IXMLDOMNodeList *childs = NULL;
pXMLDoc.CreateInstance("Msxml2.DOMDocument.4.0");
//Creating the Processing Instruction
MSXML2::IXMLDOMProcessingInstructionPtr pPI = NULL;
pPI = pXMLDoc->createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'");
_variant_t vNullVal;
vNullVal.vt = VT_NULL;
pXMLDoc->insertBefore(pPI, vNullVal);
// Creating the Root Element
MSXML2::IXMLDOMNodePtr pRootNode= NULL;
_variant_t varNodeType((short)MSXML2::NODE_ELEMENT);
pRootNode= pXMLDoc->createNode(varNodeType,
_T("directorysave"), _T(""));
pXMLDoc->appendChild(pRootNode);
linefeed(pXMLDoc,pRootNode);
savedir("c:\\demo1",pXMLDoc,pRootNode,1);
pXMLDoc->save(_T("c:\\directory.xml"));
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("save directory structure into a well formated(with tab and line feed/carriage return) xml file, by Onega\n");
CoInitialize(NULL);
test();
CoUninitialize();
return 0;
}
//http://expert.csdn.net/Expert/topic/2062/2062662.xml?temp=5.443972E-02
aoosang 2005-01-10
  • 打赏
  • 举报
回复
我觉得,如果想在文本中显示xml格式应该很困难,因为一些文本编辑软件,比如记事本都不提供xml解析的,如果你想为了显示的好看一点,我觉得还是自己加上空格和回车换行符就ok了
timing 2004-12-24
  • 打赏
  • 举报
回复
我大概没说清楚。

两段xml本来就是一个,我想要把xml写到一个文本日志窗口里,如果不缩进显示,就只有一行文本,看起来很烦,最好在写到窗口前做一下格式变换(在内存中),看起来清晰一些。就好象存成文件再用IE打开后那种显示格式就行。我想应该是很简单的事情,但说实话xslt我不懂,看起来又麻烦,所以请大家帮忙。


aoosang 2004-12-24
  • 打赏
  • 举报
回复
两段xml是一个啊?
你显示不正常,是因为你得显示控件的解析的不对,你把第一段放到IE里,肯定显示成你第二段的样式,如果你想自己解析,也可以,
io(王飞) 2004-12-24
  • 打赏
  • 举报
回复
从我的一个贴子里摘抄的,呵呵,全文见《VC中CTreeCtrl和xml文件的互导》。
io(王飞) 2004-12-24
  • 打赏
  • 举报
回复
当在程序中构造出XML DOM时,不会有缩进,而是所有节点都在一行,
(除非一边构造Dom一边写缩进代码,但那样会使程序混乱难懂),就
像前面的SaveTreeToXml,你会发现,写出来的xml文件只有一行,所
有东西都在该行。这就需要有一个函数,将这种一行的xml转换成缩
排的格式。

extern "C" void feedtabs(IXMLDOMDocument2Ptr pDoc, IXMLDOMNodePtr pParentNode, IXMLDOMNodePtr pRefNode, int tabs)
{
CString s("\n");
if(pRefNode)//第一子之前加\n\t\t\t...(tabs个)
{
for(int i=0; i<tabs; i++) s += "\t";
pParentNode->insertBefore(pDoc->createTextNode(_bstr_t(s)),(IUnknown *)pRefNode);
}
else{//最后一子后加\n\t\t\t...((tabs-1个))
for(int i=0; i<tabs-1; i++) s += "\t";
pParentNode->appendChild( pDoc->createTextNode(_bstr_t(s)) );
}
}

extern "C" void WellFormXml(IXMLDOMDocument2Ptr pDoc, IXMLDOMNodePtr pParentNode, int tabs)
{
if(pParentNode->hasChildNodes())
{
// 第一个孩子之前加"\n\t.."(tabs个'\t')
IXMLDOMNodePtr pFirstChild = pParentNode->GetfirstChild();
feedtabs(pDoc,pParentNode,pFirstChild,tabs);

// 最后一个孩子之后加"\n\t.."(tabs-1个'\t')
feedtabs(pDoc,pParentNode,NULL,tabs);

// 递归孩子
WellFormXml(pDoc,pFirstChild,tabs+1);
}

// 递归兄弟
IXMLDOMNodePtr pNextSib = pParentNode->GetnextSibling();
if( pNextSib )
{
IXMLDOMNodePtr pGrandParent = pParentNode->GetparentNode();
if( (pGrandParent != NULL) && wcscmp(pNextSib->GetnodeTypeString(),L"text") )
{
// 在下一个兄弟之前加"\n\t.."(tabs-1个'\t')
feedtabs(pDoc,pGrandParent,pNextSib,tabs-1);
WellFormXml(pDoc,pNextSib,tabs);
}
}
}

3,055

社区成员

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

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