Linux C,关于Libxml2中,如何比较两个不同的xml文档,并合并。求教。

时间:2021-07-09 08:57:52
应为工作原因,使用到Libxml2库,
经过几天学习,Libxml2的基本功能,解析,创建,查找,修改 文档等一些功能我已经会使用了
并写了一个遍历函数,用递归的。
昨天遇到新问题,要求把数个不同的xml文档合并到一个xml文档内。
比如
第一个xml文档:
<TESTNODE1>
    <A>1</A>
    <B>2</B>
</TESTNODE1>
第二个xml文档
<TESTNODE1>
    <A>1</A>
    <C>3</C>
    <D>4</D>
</TESTNODE1>
合并后的xml文档
<TESTNODE1>
    <A>1</A>
    <B>2</B>
    <C>3</C>
    <D>4</D>
</TESTNODE1>
实际文档比较复杂,包含比如属性节点,文本节点,空节点等等等等
初拟用2个文档比较,生成新的文档再和第三个文档比较,以此类推
想了一晚上,也没找到2个xml文档比较或合并的合适办法,查找Libxml2库API手册,找到一个xmlTextMerge,查了源代码,是用节点来比较,可以实现部分功能,达不到我要的效果。

小弟进入C开发这个行业不久,基础不好,希望各位大侠指点迷津。
多谢了。
并祝各位新年快乐。


15 个解决方案

#1


这个,lz的要求太高,感觉无解。
虽然我不懂这个,但我知道svn这类的merge也不是万能的,如果有冲突还是要人工参与的。

lz要完成全自动的?

#2


两个文档间的冲突部分如何来处理,这个算法是没有问题的
关键问题是如何同时遍历两个xml文档并且节点层次要保持同步,以达到同层次节点一一比较的目的。

是要全自动的,并且通用。因为每一类xml文档的文档结构都不一样。
大侠们出来啊~

#3


先把XML都格式化成统一的格式,然后文本合并。准确率就靠天意了。

#4


文本合并。。也太不靠谱了吧
如果是<A name =1 valu =2/>
这种节点咋整。。。
由于是要做搜索多个网域的文件并合并,得到的结果还会用作很多操作
所以必须有准确率要求的,要是简单的合并起来那就没有意义了

#5


那就别做梦了,做不到。所谓准确合并本来就是不可解的。你一个节点value是1,另一个节点value是2,怎么合并?

#6


如果第一个节点value是1,第二个节点value是2,
如果这两个节点名相同,如
<A>1</A>

<A>2</A>
则把这2个节点放在新的xml文档内,节点2插入在节点1的父节点中,则:
<A>1</A>
<A>2</A>
然后后续对A的取值则由其他的程序模块去判定
如何来合并。内部算法是可以定的,这些不是问题
我主要搞不懂的,是如何在一个线程中遍历两个不同的xml文档,并且比较其差异
当然,这两个xml文档的结构肯定是相同的

#7


不知道你急不急要,很粗略的写了这个, 里面有很多需要完善的地方
也没实现你所说的合并,但大体是可以出来了。

#include "tinystr.h"
#include "tinyxml.h"
#include "myxmltest.h"
#include <stdio.h>
#include <iostream>

using namespace std;

//compare value smaller =1 greater =-1 equ =0
int SmallerValue(TiXmlElement **TiXmlElementArraytest , int testindex , TiXmlElement **TiXmlElementArraytest2 , int testindex2);
//Merge function should be impleted here
void PrintFun(TiXmlElement **TiXmlElementArraytest , int testindex );

int main(void)
{



TiXmlDocument *myDocument = new TiXmlDocument("/tmp/Example.xml");
myDocument ->LoadFile();

//begin read
TiXmlElement *RootElement = myDocument->RootElement();



//RSS -> channel -> title -> Item

TiXmlElement *RSSItem = RootElement->FirstChildElement();
TiXmlElement *channelItem = RSSItem->FirstChildElement();
TiXmlElement *LinkChannelItem =channelItem->NextSiblingElement();
TiXmlElement *DescriptionChannelItem =LinkChannelItem->NextSiblingElement();
TiXmlElement *LanguageChannelItem =DescriptionChannelItem->NextSiblingElement();
TiXmlElement *CopyRigthChannelItem =LanguageChannelItem->NextSiblingElement();
TiXmlElement *DocsChannelItem =CopyRigthChannelItem->NextSiblingElement();
TiXmlElement *GenneratorChannelItem =DocsChannelItem->NextSiblingElement();
TiXmlElement *FirstItem = GenneratorChannelItem->NextSiblingElement();

int index = 0;


while ( FirstItem != NULL )
{
TiXmlElement *ID = FirstItem->FirstChildElement();
TiXmlElement *Title = ID->NextSiblingElement();
TiXmlElement *Link = Title->NextSiblingElement();
TiXmlElement *Author = Link->NextSiblingElement();
TiXmlElement *PubDate = Author->NextSiblingElement();
TiXmlElement *Description = PubDate->NextSiblingElement();

TiXmlElementArray1[index] = FirstItem;

//handle the element here 
//print the ID Element
if( TiXmlElementArray1[index]->FirstChildElement() != NULL )
if( TiXmlElementArray1[index]->FirstChildElement()->FirstChild() != NULL )
{
//cout << TiXmlElementArray1[index]->FirstChildElement()->FirstChild()->Value() <<endl; 
}
index = index + 1;
FirstItem = FirstItem->NextSiblingElement();
}

//cout << index << endl;//1002

//=======================================

TiXmlDocument *myDocument2 = new TiXmlDocument("/tmp/Example2.xml");
myDocument2 ->LoadFile();

//begin read
TiXmlElement *RootElement2 = myDocument2->RootElement();



//RSS -> channel -> title -> Item

TiXmlElement *RSSItem2 = RootElement2->FirstChildElement();
TiXmlElement *channelItem2 = RSSItem2->FirstChildElement();
TiXmlElement *LinkChannelItem2 =channelItem2->NextSiblingElement();
TiXmlElement *DescriptionChannelItem2 =LinkChannelItem2->NextSiblingElement();
TiXmlElement *LanguageChannelItem2 =DescriptionChannelItem2->NextSiblingElement();
TiXmlElement *CopyRigthChannelItem2 =LanguageChannelItem2->NextSiblingElement();
TiXmlElement *DocsChannelItem2 =CopyRigthChannelItem2->NextSiblingElement();
TiXmlElement *GenneratorChannelItem2 =DocsChannelItem2->NextSiblingElement();
TiXmlElement *FirstItem2 = GenneratorChannelItem2->NextSiblingElement();

int index2 = 0;

int val = 0;
char charRet[100];

while ( FirstItem2 != NULL )
{
TiXmlElement *ID2 = FirstItem2->FirstChildElement();
TiXmlElement *Title2 = ID2->NextSiblingElement();
TiXmlElement *Link2 = Title2->NextSiblingElement();
TiXmlElement *Author2 = Link2->NextSiblingElement();
TiXmlElement *PubDate2 = Author2->NextSiblingElement();
TiXmlElement *Description2 = PubDate2->NextSiblingElement();

TiXmlElementArray2[index2] = FirstItem2;

//handle the element here 
//print the ID Element
if( TiXmlElementArray2[index2]->FirstChildElement() != NULL )
if( TiXmlElementArray2[index2]->FirstChildElement()->FirstChild() != NULL )
{
//cout << TiXmlElementArray2[index2]->FirstChildElement()->FirstChild()->Value() <<endl;
}
index2 = index2 + 1;
FirstItem2 = FirstItem2->NextSiblingElement();
}

//cout << index << endl;//1002

//compare

FirstItem = GenneratorChannelItem->NextSiblingElement();
FirstItem2 = GenneratorChannelItem2->NextSiblingElement();

//cout << "#### Compare Result ####" <<endl;
int firstCompResult = SmallerValue(TiXmlElementArray1 , 0 , TiXmlElementArray2 , 0) ;

TiXmlElement **TiXmlElementArraySmall;
if (firstCompResult >= 0 )
TiXmlElementArraySmall = TiXmlElementArray1;
else
TiXmlElementArraySmall = TiXmlElementArray2;

int SmallEndInt ;
if (index < index2 )
SmallEndInt = index ;
else
SmallEndInt = index2 ;

int cur1 = 0;
int cur2 =0;
while(cur1 < index || cur2 < index2 )
{
if ((cur1 >= index || cur2 >= index2  ))
break;
else
while(  SmallerValue(TiXmlElementArray1 , cur1 , TiXmlElementArray2 , cur2) > 0 ) //TiXmlElementArray1 < TiXmlElementArray2
{
//do something 
PrintFun( TiXmlElementArray1 , cur1 );
cur1++;
if (cur1 >= index )
break;
}

if ((cur1 >= index || cur2 >= index2  ))
break;
else
{
while(  SmallerValue(TiXmlElementArray1 , cur1 , TiXmlElementArray2 , cur2) < 0 )//TiXmlElementArray1 > TiXmlElementArray2
{
//do something
PrintFun( TiXmlElementArray2 , cur2 );
cur2++;
if ( cur2 >= index2  )
break;
}
}

if ((cur1 >= index || cur2 >= index2  ))
break;
else
{
while(  SmallerValue(TiXmlElementArray1 , cur1 , TiXmlElementArray2 , cur2) == 0  )//TiXmlElementArray1 = TiXmlElementArray2
{
//do something
PrintFun( TiXmlElementArray1 , cur1 );
cur2++;
cur1++;
if (( cur1 >= index || cur2 >= index2 ))
break;
}
}
}

cout << "#cur1 " ;
cout << cur1 <<endl;
cout << "#cur2 " ;
cout << cur2 <<endl;

if ( cur1 >= index ) //first doc has compeleted 
while( cur2 < index2  )
{
//do something
PrintFun( TiXmlElementArray2 , cur2 );
cur2++;
}
if ( cur2 >= index2 ) //second doc has compeleted 
while( cur1 < index  )
{
//do something
PrintFun( TiXmlElementArray1 , cur1 );
cur1++;
}


//=====================
delete myDocument;
delete myDocument2;
//end read



cout << "#### Loop done ####" <<endl;
return 1;
}

//Merge function should be impleted here
void PrintFun(TiXmlElement **TiXmlElementArraytest , int testindex )
{
cout << "we got : " ;
cout << TiXmlElementArraytest[testindex]->FirstChildElement()->FirstChild()->Value() << endl; 
}

//compare value
//smaller =1 greater =-1 equ =0
int SmallerValue(TiXmlElement **TiXmlElementArraytest , int testindex , TiXmlElement **TiXmlElementArraytest2 , int testindex2)
{
const char *val1 = TiXmlElementArraytest[testindex]->FirstChildElement()->FirstChild()->Value();

const char *val2 = TiXmlElementArraytest2[testindex2]->FirstChildElement()->FirstChild()->Value();

//需要将const char 转化为int
int valint1 , valint2;

valint1 = atoi(val1);
valint2 = atoi(val2);

//  cout << "valint1 " ;
//  cout << valint1 <<endl;
//  cout << "valint2 " ;
//  cout << valint2 <<endl;

if ( valint1 == valint2 )
return 0;
else if ( valint1 < valint2 )
return 1;
else 
return -1;
}

#8


Example2.xml

<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0">

  <channel>

    <title>ZL_Link</title>

    <link>http://www.edzh.com/Html/Catalog/index.shtml</link>

    <description>Rss</description>

    <language>zh-cn</language>

    <copyright>

    </copyright>

    <docs>

    </docs>

    <generator>

    </generator>

  

    <item>

      <ID>6</ID>

      <title>title1</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description1]]></description>

    </item>

    <item>

      <ID>7</ID>

      <title>title2</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description2]]></description>

    </item>

    <item>

      <ID>8</ID>

      <title>title3</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description3]]></description>

    </item>

    <item>

      <ID>9</ID>

      <title>title4</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description4]]></description>

    </item>

    <item>

      <ID>10</ID>

      <title>title5</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description5]]></description>

    </item>

    <item>

      <ID>11</ID>

      <title>title6</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description6]]></description>

    </item>

    <item>

      <ID>997</ID>

      <title>title992</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description992]]></description>

    </item>

    <item>

      <ID>998</ID>

      <title>title993</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description993]]></description>

    </item>

    <item>

      <ID>999</ID>

      <title>title994</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description994]]></description>

    </item>

    <item>

      <ID>1000</ID>

      <title>title995</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description995]]></description>

    </item>

    <item>

      <ID>1001</ID>

      <title>title996</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description996]]></description>

    </item>

    <item>

      <ID>1006</ID>

      <title>title997</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description997]]></description>

    </item>

    <item>

      <ID>1007</ID>

      <title>title998</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description998]]></description>

    </item>

    <item>

      <ID>1008</ID>

      <title>title999</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description999]]></description>

    </item>
 <item>

      <ID>1010</ID>

      <title>title1000</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description999]]></description>

    </item>

  </channel>

</rss>

#9


Example.xml

<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0">

  <channel>

    <title>ZL_Link</title>

    <link>http://www.edzh.com/Html/Catalog/index.shtml</link>

    <description>Rss</description>

    <language>zh-cn</language>

    <copyright>

    </copyright>

    <docs>

    </docs>

    <generator>

    </generator>

    <item>

      <ID>1</ID>

      <title>如何进行听</title>

      <link>http://www.126.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[好好听]]></description>

    </item>

    <item>

      <ID>2</ID>

      <title>如何进行听2</title>

      <link>http://www.baidu.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[认真听]]></description>

    </item>

    <item>

      <ID>3</ID>

      <title>如何进行写</title>

      <link>http://www.163.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[好好活]]></description>

    </item>

    <item>

      <ID>6</ID>

      <title>title1</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description1]]></description>

    </item>
    <item>

      <ID>7</ID>

      <title>title2</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description1]]></description>

    </item>

    <item>

      <ID>1000</ID>

      <title>title995</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description995]]></description>

    </item>

   

    <item>

      <ID>1003</ID>

      <title>title998</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description998]]></description>

    </item>

    <item>

      <ID>1004</ID>

      <title>title999</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description999]]></description>

    </item>

  </channel>

</rss>

#10


引用 2 楼 dqvega 的回复:
两个文档间的冲突部分如何来处理,这个算法是没有问题的
关键问题是如何同时遍历两个xml文档并且节点层次要保持同步,以达到同层次节点一一比较的目的。

是要全自动的,并且通用。因为每一类xml文档的文档结构都不一样。
大侠们出来啊~

while(1){
访问完1个文档,保存节点地址,去访问第2个文档,保存节点地址,对比
}

提供个思路

#11


我在手册中发现,xinclude有几个功能函数可以实现拼接

#12


<node attr="1"/>
<node attr="2"/>

这个你怎么合并?

#13


该回复于2011-06-13 15:22:15被版主删除

#14


没想到隔了这么久,还有大虾拔刀相助,虽然现在不做这个了,但是还是非常感谢

#15


引用 7 楼 no7dw 的回复:
不知道你急不急要,很粗略的写了这个,里面有很多需要完善的地方
也没实现你所说的合并,但大体是可以出来了。
C/C++ code

#include "tinystr.h"
#include "tinyxml.h"
#include "myxmltest.h"
#include <stdio.h>
#include <iostream>

using namespace std;

//com……

其实当时用的是LIBXML,TINYXML我这会儿才开始学,希望能有帮组,多谢了

#1


这个,lz的要求太高,感觉无解。
虽然我不懂这个,但我知道svn这类的merge也不是万能的,如果有冲突还是要人工参与的。

lz要完成全自动的?

#2


两个文档间的冲突部分如何来处理,这个算法是没有问题的
关键问题是如何同时遍历两个xml文档并且节点层次要保持同步,以达到同层次节点一一比较的目的。

是要全自动的,并且通用。因为每一类xml文档的文档结构都不一样。
大侠们出来啊~

#3


先把XML都格式化成统一的格式,然后文本合并。准确率就靠天意了。

#4


文本合并。。也太不靠谱了吧
如果是<A name =1 valu =2/>
这种节点咋整。。。
由于是要做搜索多个网域的文件并合并,得到的结果还会用作很多操作
所以必须有准确率要求的,要是简单的合并起来那就没有意义了

#5


那就别做梦了,做不到。所谓准确合并本来就是不可解的。你一个节点value是1,另一个节点value是2,怎么合并?

#6


如果第一个节点value是1,第二个节点value是2,
如果这两个节点名相同,如
<A>1</A>

<A>2</A>
则把这2个节点放在新的xml文档内,节点2插入在节点1的父节点中,则:
<A>1</A>
<A>2</A>
然后后续对A的取值则由其他的程序模块去判定
如何来合并。内部算法是可以定的,这些不是问题
我主要搞不懂的,是如何在一个线程中遍历两个不同的xml文档,并且比较其差异
当然,这两个xml文档的结构肯定是相同的

#7


不知道你急不急要,很粗略的写了这个, 里面有很多需要完善的地方
也没实现你所说的合并,但大体是可以出来了。

#include "tinystr.h"
#include "tinyxml.h"
#include "myxmltest.h"
#include <stdio.h>
#include <iostream>

using namespace std;

//compare value smaller =1 greater =-1 equ =0
int SmallerValue(TiXmlElement **TiXmlElementArraytest , int testindex , TiXmlElement **TiXmlElementArraytest2 , int testindex2);
//Merge function should be impleted here
void PrintFun(TiXmlElement **TiXmlElementArraytest , int testindex );

int main(void)
{



TiXmlDocument *myDocument = new TiXmlDocument("/tmp/Example.xml");
myDocument ->LoadFile();

//begin read
TiXmlElement *RootElement = myDocument->RootElement();



//RSS -> channel -> title -> Item

TiXmlElement *RSSItem = RootElement->FirstChildElement();
TiXmlElement *channelItem = RSSItem->FirstChildElement();
TiXmlElement *LinkChannelItem =channelItem->NextSiblingElement();
TiXmlElement *DescriptionChannelItem =LinkChannelItem->NextSiblingElement();
TiXmlElement *LanguageChannelItem =DescriptionChannelItem->NextSiblingElement();
TiXmlElement *CopyRigthChannelItem =LanguageChannelItem->NextSiblingElement();
TiXmlElement *DocsChannelItem =CopyRigthChannelItem->NextSiblingElement();
TiXmlElement *GenneratorChannelItem =DocsChannelItem->NextSiblingElement();
TiXmlElement *FirstItem = GenneratorChannelItem->NextSiblingElement();

int index = 0;


while ( FirstItem != NULL )
{
TiXmlElement *ID = FirstItem->FirstChildElement();
TiXmlElement *Title = ID->NextSiblingElement();
TiXmlElement *Link = Title->NextSiblingElement();
TiXmlElement *Author = Link->NextSiblingElement();
TiXmlElement *PubDate = Author->NextSiblingElement();
TiXmlElement *Description = PubDate->NextSiblingElement();

TiXmlElementArray1[index] = FirstItem;

//handle the element here 
//print the ID Element
if( TiXmlElementArray1[index]->FirstChildElement() != NULL )
if( TiXmlElementArray1[index]->FirstChildElement()->FirstChild() != NULL )
{
//cout << TiXmlElementArray1[index]->FirstChildElement()->FirstChild()->Value() <<endl; 
}
index = index + 1;
FirstItem = FirstItem->NextSiblingElement();
}

//cout << index << endl;//1002

//=======================================

TiXmlDocument *myDocument2 = new TiXmlDocument("/tmp/Example2.xml");
myDocument2 ->LoadFile();

//begin read
TiXmlElement *RootElement2 = myDocument2->RootElement();



//RSS -> channel -> title -> Item

TiXmlElement *RSSItem2 = RootElement2->FirstChildElement();
TiXmlElement *channelItem2 = RSSItem2->FirstChildElement();
TiXmlElement *LinkChannelItem2 =channelItem2->NextSiblingElement();
TiXmlElement *DescriptionChannelItem2 =LinkChannelItem2->NextSiblingElement();
TiXmlElement *LanguageChannelItem2 =DescriptionChannelItem2->NextSiblingElement();
TiXmlElement *CopyRigthChannelItem2 =LanguageChannelItem2->NextSiblingElement();
TiXmlElement *DocsChannelItem2 =CopyRigthChannelItem2->NextSiblingElement();
TiXmlElement *GenneratorChannelItem2 =DocsChannelItem2->NextSiblingElement();
TiXmlElement *FirstItem2 = GenneratorChannelItem2->NextSiblingElement();

int index2 = 0;

int val = 0;
char charRet[100];

while ( FirstItem2 != NULL )
{
TiXmlElement *ID2 = FirstItem2->FirstChildElement();
TiXmlElement *Title2 = ID2->NextSiblingElement();
TiXmlElement *Link2 = Title2->NextSiblingElement();
TiXmlElement *Author2 = Link2->NextSiblingElement();
TiXmlElement *PubDate2 = Author2->NextSiblingElement();
TiXmlElement *Description2 = PubDate2->NextSiblingElement();

TiXmlElementArray2[index2] = FirstItem2;

//handle the element here 
//print the ID Element
if( TiXmlElementArray2[index2]->FirstChildElement() != NULL )
if( TiXmlElementArray2[index2]->FirstChildElement()->FirstChild() != NULL )
{
//cout << TiXmlElementArray2[index2]->FirstChildElement()->FirstChild()->Value() <<endl;
}
index2 = index2 + 1;
FirstItem2 = FirstItem2->NextSiblingElement();
}

//cout << index << endl;//1002

//compare

FirstItem = GenneratorChannelItem->NextSiblingElement();
FirstItem2 = GenneratorChannelItem2->NextSiblingElement();

//cout << "#### Compare Result ####" <<endl;
int firstCompResult = SmallerValue(TiXmlElementArray1 , 0 , TiXmlElementArray2 , 0) ;

TiXmlElement **TiXmlElementArraySmall;
if (firstCompResult >= 0 )
TiXmlElementArraySmall = TiXmlElementArray1;
else
TiXmlElementArraySmall = TiXmlElementArray2;

int SmallEndInt ;
if (index < index2 )
SmallEndInt = index ;
else
SmallEndInt = index2 ;

int cur1 = 0;
int cur2 =0;
while(cur1 < index || cur2 < index2 )
{
if ((cur1 >= index || cur2 >= index2  ))
break;
else
while(  SmallerValue(TiXmlElementArray1 , cur1 , TiXmlElementArray2 , cur2) > 0 ) //TiXmlElementArray1 < TiXmlElementArray2
{
//do something 
PrintFun( TiXmlElementArray1 , cur1 );
cur1++;
if (cur1 >= index )
break;
}

if ((cur1 >= index || cur2 >= index2  ))
break;
else
{
while(  SmallerValue(TiXmlElementArray1 , cur1 , TiXmlElementArray2 , cur2) < 0 )//TiXmlElementArray1 > TiXmlElementArray2
{
//do something
PrintFun( TiXmlElementArray2 , cur2 );
cur2++;
if ( cur2 >= index2  )
break;
}
}

if ((cur1 >= index || cur2 >= index2  ))
break;
else
{
while(  SmallerValue(TiXmlElementArray1 , cur1 , TiXmlElementArray2 , cur2) == 0  )//TiXmlElementArray1 = TiXmlElementArray2
{
//do something
PrintFun( TiXmlElementArray1 , cur1 );
cur2++;
cur1++;
if (( cur1 >= index || cur2 >= index2 ))
break;
}
}
}

cout << "#cur1 " ;
cout << cur1 <<endl;
cout << "#cur2 " ;
cout << cur2 <<endl;

if ( cur1 >= index ) //first doc has compeleted 
while( cur2 < index2  )
{
//do something
PrintFun( TiXmlElementArray2 , cur2 );
cur2++;
}
if ( cur2 >= index2 ) //second doc has compeleted 
while( cur1 < index  )
{
//do something
PrintFun( TiXmlElementArray1 , cur1 );
cur1++;
}


//=====================
delete myDocument;
delete myDocument2;
//end read



cout << "#### Loop done ####" <<endl;
return 1;
}

//Merge function should be impleted here
void PrintFun(TiXmlElement **TiXmlElementArraytest , int testindex )
{
cout << "we got : " ;
cout << TiXmlElementArraytest[testindex]->FirstChildElement()->FirstChild()->Value() << endl; 
}

//compare value
//smaller =1 greater =-1 equ =0
int SmallerValue(TiXmlElement **TiXmlElementArraytest , int testindex , TiXmlElement **TiXmlElementArraytest2 , int testindex2)
{
const char *val1 = TiXmlElementArraytest[testindex]->FirstChildElement()->FirstChild()->Value();

const char *val2 = TiXmlElementArraytest2[testindex2]->FirstChildElement()->FirstChild()->Value();

//需要将const char 转化为int
int valint1 , valint2;

valint1 = atoi(val1);
valint2 = atoi(val2);

//  cout << "valint1 " ;
//  cout << valint1 <<endl;
//  cout << "valint2 " ;
//  cout << valint2 <<endl;

if ( valint1 == valint2 )
return 0;
else if ( valint1 < valint2 )
return 1;
else 
return -1;
}

#8


Example2.xml

<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0">

  <channel>

    <title>ZL_Link</title>

    <link>http://www.edzh.com/Html/Catalog/index.shtml</link>

    <description>Rss</description>

    <language>zh-cn</language>

    <copyright>

    </copyright>

    <docs>

    </docs>

    <generator>

    </generator>

  

    <item>

      <ID>6</ID>

      <title>title1</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description1]]></description>

    </item>

    <item>

      <ID>7</ID>

      <title>title2</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description2]]></description>

    </item>

    <item>

      <ID>8</ID>

      <title>title3</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description3]]></description>

    </item>

    <item>

      <ID>9</ID>

      <title>title4</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description4]]></description>

    </item>

    <item>

      <ID>10</ID>

      <title>title5</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description5]]></description>

    </item>

    <item>

      <ID>11</ID>

      <title>title6</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description6]]></description>

    </item>

    <item>

      <ID>997</ID>

      <title>title992</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description992]]></description>

    </item>

    <item>

      <ID>998</ID>

      <title>title993</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description993]]></description>

    </item>

    <item>

      <ID>999</ID>

      <title>title994</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description994]]></description>

    </item>

    <item>

      <ID>1000</ID>

      <title>title995</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description995]]></description>

    </item>

    <item>

      <ID>1001</ID>

      <title>title996</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description996]]></description>

    </item>

    <item>

      <ID>1006</ID>

      <title>title997</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description997]]></description>

    </item>

    <item>

      <ID>1007</ID>

      <title>title998</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description998]]></description>

    </item>

    <item>

      <ID>1008</ID>

      <title>title999</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description999]]></description>

    </item>
 <item>

      <ID>1010</ID>

      <title>title1000</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description999]]></description>

    </item>

  </channel>

</rss>

#9


Example.xml

<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0">

  <channel>

    <title>ZL_Link</title>

    <link>http://www.edzh.com/Html/Catalog/index.shtml</link>

    <description>Rss</description>

    <language>zh-cn</language>

    <copyright>

    </copyright>

    <docs>

    </docs>

    <generator>

    </generator>

    <item>

      <ID>1</ID>

      <title>如何进行听</title>

      <link>http://www.126.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[好好听]]></description>

    </item>

    <item>

      <ID>2</ID>

      <title>如何进行听2</title>

      <link>http://www.baidu.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[认真听]]></description>

    </item>

    <item>

      <ID>3</ID>

      <title>如何进行写</title>

      <link>http://www.163.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[好好活]]></description>

    </item>

    <item>

      <ID>6</ID>

      <title>title1</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description1]]></description>

    </item>
    <item>

      <ID>7</ID>

      <title>title2</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description1]]></description>

    </item>

    <item>

      <ID>1000</ID>

      <title>title995</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description995]]></description>

    </item>

   

    <item>

      <ID>1003</ID>

      <title>title998</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description998]]></description>

    </item>

    <item>

      <ID>1004</ID>

      <title>title999</title>

      <link>http://www.123.com</link>

      <author>

      </author>

      <pubDate>

      </pubDate>

      <description><![CDATA[description999]]></description>

    </item>

  </channel>

</rss>

#10


引用 2 楼 dqvega 的回复:
两个文档间的冲突部分如何来处理,这个算法是没有问题的
关键问题是如何同时遍历两个xml文档并且节点层次要保持同步,以达到同层次节点一一比较的目的。

是要全自动的,并且通用。因为每一类xml文档的文档结构都不一样。
大侠们出来啊~

while(1){
访问完1个文档,保存节点地址,去访问第2个文档,保存节点地址,对比
}

提供个思路

#11


我在手册中发现,xinclude有几个功能函数可以实现拼接

#12


<node attr="1"/>
<node attr="2"/>

这个你怎么合并?

#13


该回复于2011-06-13 15:22:15被版主删除

#14


没想到隔了这么久,还有大虾拔刀相助,虽然现在不做这个了,但是还是非常感谢

#15


引用 7 楼 no7dw 的回复:
不知道你急不急要,很粗略的写了这个,里面有很多需要完善的地方
也没实现你所说的合并,但大体是可以出来了。
C/C++ code

#include "tinystr.h"
#include "tinyxml.h"
#include "myxmltest.h"
#include <stdio.h>
#include <iostream>

using namespace std;

//com……

其实当时用的是LIBXML,TINYXML我这会儿才开始学,希望能有帮组,多谢了