当前位置:编程学习 > wap >>

求问一个用QXML解析SCD的问题,多谢。

在解析一个XML中的这样的一个部分的时候,
1,<SDI name="SBOw">
2, <DAI name="ctlVal" sAddr="B37.AutoReclose.vbi_ar_bc">
3, <Val>0</Val>
4, </DAI>
5, <SDI name="origin">
6, <DAI name="orCat" sAddr="debug">
7, <Val>0</Val>
8, </DAI>
9, <DAI name="orIdent"/>
</SDI>
<DAI name="ctlNum"/>
<DAI name="T"/>
<DAI name="Test"/>
<DAI name="Check"/>
</SDI>

如下的代码,

tag="SDI";
QDomNodeList LN0_SDIlist = LN0_DOIlist.item(LN0_DOI_index).toElement().elementsByTagName(tag);
lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].SDInum =LN0_SDIlist.length(); 

if( LN0_SDIlist.length()>0 )
lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo =(T_61850_SDINFO *)malloc(sizeof(T_61850_SDINFO)*(LN0_SDIlist.length()));
if(lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo )
{
memset( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo, 0, sizeof(T_61850_SDINFO)*(LN0_SDIlist.length()) ); 
QDomAttr LN0SDIname;
QString LN0_SDI_name;

for( int LN0_SDIindex=0;LN0_SDIindex<LN0_SDIlist.length() ;LN0_SDIindex++)
{
if( LN0_SDIlist.item(LN0_SDIindex).toElement().hasAttribute("name"))
{
LN0SDIname= LN0_SDIlist.item(LN0_SDIindex).toElement().attributeNode( "name" );
LN0_SDI_name = LN0SDIname.value();
}
else
LN0_SDI_name="";
strcpy( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_SDIindex].SDIname,CODEU(LN0_SDI_name)); 

//DOI下的SDI下的DAI
tag=CODEC( "DAI");
QDomNodeList LN0_DAIlist = LN0_SDIlist.item(LN0_SDIindex).toElement().elementsByTagName(tag);
lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_SDIindex].SDI_DAInum =LN0_DAIlist.length(); 
lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_SDIindex].pDAIInfo =(T_61850_DAIINFO *)malloc(sizeof(T_61850_DAIINFO)*(LN0_DAIlist.length()));
if(lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_SDIindex].pDAIInfo )
{
memset( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_SDIindex].pDAIInfo, 0, sizeof(T_61850_DAIINFO)*(LN0_DAIlist.length()) ); 
QDomAttr LN0DAIname;
QString LN0_DAI_name;
QDomAttr LN0DAIVal;
QString LN0_DAI_Val;

QDomAttr LN0DAIsAddr;
QString LN0_DAI_sAddr;

for( int LN0_DAIindex=0;LN0_DAIindex<LN0_DAIlist.length() ;LN0_DAIindex++)
{
if( LN0_DAIlist.item(LN0_DAIindex).toElement().hasAttribute("name"))
{
LN0DAIname= LN0_DAIlist.item(LN0_DAIindex).toElement().attributeNode( "name" );
LN0_DAI_name = LN0DAIname.value();
}
else
LN0_DAI_name="";
strcpy( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_SDIindex].pDAIInfo[LN0_DAIindex].SDI_DAIname,CODEU(LN0_DAI_name)); 


if( LN0_DAIlist.item(LN0_DAIindex).toElement().hasAttribute("sAddr"))
{
LN0DAIsAddr= LN0_DAIlist.item(LN0_DAIindex).toElement().attributeNode( "sAddr" );
LN0_DAI_sAddr = LN0DAIsAddr.value();
}
else
LN0_DAI_sAddr="";

if(LN0_DAI_sAddr.length()<=63 )
strcpy( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_SDIindex].pDAIInfo[LN0_DAIindex].DAI_sAddr,CODEU(LN0_DAI_sAddr)); 
else
memcpy( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_SDIindex].pDAIInfo[LN0_DAIindex].DAI_sAddr,CODEU(LN0_DAI_sAddr),63); 

tag=CODEC( "Val");// val 获取它中间的值 <Val>100.0</Val>区别于<SDI name="maxVal">这类量的获取方法
QDomNodeList LN0_DAIVallist = LN0_DAIlist.item(LN0_DAIindex).toElement().elementsByTagName(tag);
int aaa = LN0_DAIVallist.length();
//****************出问题的行****************//
LN0_DAI_Val = LN0_DAIVallist.item(0).toElement().text(); 


if(LN0_DAI_Val.length()<=63)
strcpy( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_SDIindex].pDAIInfo[LN0_DAIindex].DAIvalue,CODEU(LN0_DAI_Val));     
else
memcpy( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_SDIindex].pDAIInfo[LN0_DAIindex].DAIvalue,CODEU(LN0_DAI_Val),63); 
//////


}
}
}
}

在解析XML中的那个第7行的时候在下面//****出问题的行***//那会直接报错误退出来了,而在解析上面同样的第3行的时候却无问题,求教,谢谢。 --------------------编程问答-------------------- 是不是我的帖子比较难看,没人回呀,哎。郁闷。 --------------------编程问答-------------------- 是的,xml格式没有贴好
代码格式也没有贴好,让人怎么看呢? --------------------编程问答--------------------
引用 2 楼 ppdayz 的回复:
是的,xml格式没有贴好
代码格式也没有贴好,让人怎么看呢?

	tag = "DAI";
QDomNodeList LN0_NewDAIlist= LN0_DOIlist.item(LN0_DOI_index).toElement().elementsByTagName(tag);
if( LN0_NewDAIlist.length()>0 )
{
if( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].SDInum==0 )
{
lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].SDInum =LN0_NewDAIlist.length(); 
lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo =(T_61850_SDINFO *)malloc(sizeof(T_61850_SDINFO)*(LN0_NewDAIlist.length()));
if(lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo )
memset( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo, 0, sizeof(T_61850_SDINFO)*(LN0_NewDAIlist.length()) ); 
}
else if((lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].SDInum>0)&&(lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].SDInum < LN0_NewDAIlist.length()))
{
lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].SDInum =LN0_NewDAIlist.length(); 
lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo =(T_61850_SDINFO *)realloc(lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo,sizeof(T_61850_SDINFO)*(LN0_NewDAIlist.length()));
if(lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo )
memset( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo, 0, sizeof(T_61850_SDINFO)*(LN0_NewDAIlist.length()) ); 
}

QDomAttr LN0NewDAIname;
QString LN0_NewDAI_name;
QDomAttr LN0NewDAIVal;
QString LN0_NewDAI_Val;

QDomAttr LN0NewDAIsAddr;
QString LN0_NewDAI_sAddr;
for( int LN0_NewDAIindex=0;LN0_NewDAIindex<LN0_NewDAIlist.length() ;LN0_NewDAIindex++)
{
if( LN0_NewDAIlist.item(LN0_NewDAIindex).toElement().hasAttribute("name"))
{
LN0NewDAIname= LN0_NewDAIlist.item(LN0_NewDAIindex).toElement().attributeNode( "name" );
LN0_NewDAI_name = LN0NewDAIname.value();
}
else
LN0_NewDAI_name="";


lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_NewDAIindex].SDI_DAInum =1; 
lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_NewDAIindex].pDAIInfo =(T_61850_DAIINFO *)malloc(sizeof(T_61850_DAIINFO)*(1));
if(lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_NewDAIindex].pDAIInfo )
memset( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_NewDAIindex].pDAIInfo, 0, sizeof(T_61850_DAIINFO)*(1) ); 

strcpy( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_NewDAIindex].pDAIInfo[0].SDI_DAIname,CODEU(LN0_NewDAI_name)); 

if( LN0_NewDAIlist.item(LN0_NewDAIindex).toElement().hasAttribute("sAddr"))
{
LN0NewDAIsAddr= LN0_NewDAIlist.item(LN0_NewDAIindex).toElement().attributeNode( "sAddr" );
LN0_NewDAI_sAddr = LN0NewDAIsAddr.value();
}
else
LN0_NewDAI_sAddr="";
if(LN0_NewDAI_sAddr.length()<=63)
strcpy( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_NewDAIindex].pDAIInfo[0].DAI_sAddr ,CODEU(LN0_NewDAI_sAddr)); 
else
memcpy( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_NewDAIindex].pDAIInfo[0].DAI_sAddr ,CODEU(LN0_NewDAI_sAddr),63); 

tag = "Val";
QDomNodeList LN0_NewDAIVallist = LN0_NewDAIlist.item(LN0_NewDAIindex).toElement().elementsByTagName(tag);
LN0_NewDAI_Val = LN0_NewDAIVallist.item(0).toElement().text(); 
if(LN0_NewDAI_Val.length()<=63)
strcpy( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_NewDAIindex].pDAIInfo[0].DAIvalue,CODEU(LN0_NewDAI_Val));    
else
memcpy( lp_SCLINFO->lp_IDInfo[IEDindex].lp_ServerInfo[Serverindex].pLDInfo[LDindex].pLNInfo[0].pDOdescINFO[LN0_DOI_index].pSDIInfo[LN0_NewDAIindex].pDAIInfo[0].DAIvalue,CODEU(LN0_NewDAI_Val),63); 
//////

}
}//跳这个循环的时候报错。


XML是如下的结构:
						<DOI name="Mod" desc="模式">
<DAI name="stVal"/>
<DAI name="q"/>
<DAI name="t"/>
<DAI name="ctlModel">
<Val>0</Val>
</DAI>
</DOI>
补充:移动开发 ,  Qt
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,