经过几天学习,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要完成全自动的?
虽然我不懂这个,但我知道svn这类的merge也不是万能的,如果有冲突还是要人工参与的。
lz要完成全自动的?
#2
两个文档间的冲突部分如何来处理,这个算法是没有问题的
关键问题是如何同时遍历两个xml文档并且节点层次要保持同步,以达到同层次节点一一比较的目的。
是要全自动的,并且通用。因为每一类xml文档的文档结构都不一样。
大侠们出来啊~
关键问题是如何同时遍历两个xml文档并且节点层次要保持同步,以达到同层次节点一一比较的目的。
是要全自动的,并且通用。因为每一类xml文档的文档结构都不一样。
大侠们出来啊~
#3
先把XML都格式化成统一的格式,然后文本合并。准确率就靠天意了。
#4
文本合并。。也太不靠谱了吧
如果是<A name =1 valu =2/>
这种节点咋整。。。
由于是要做搜索多个网域的文件并合并,得到的结果还会用作很多操作
所以必须有准确率要求的,要是简单的合并起来那就没有意义了
如果是<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文档的结构肯定是相同的
如果这两个节点名相同,如
<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
while(1){
访问完1个文档,保存节点地址,去访问第2个文档,保存节点地址,对比
}
提供个思路
#11
我在手册中发现,xinclude有几个功能函数可以实现拼接
#12
<node attr="1"/>
<node attr="2"/>
这个你怎么合并?
<node attr="2"/>
这个你怎么合并?
#13
#14
没想到隔了这么久,还有大虾拔刀相助,虽然现在不做这个了,但是还是非常感谢
#15
其实当时用的是LIBXML,TINYXML我这会儿才开始学,希望能有帮组,多谢了
#1
这个,lz的要求太高,感觉无解。
虽然我不懂这个,但我知道svn这类的merge也不是万能的,如果有冲突还是要人工参与的。
lz要完成全自动的?
虽然我不懂这个,但我知道svn这类的merge也不是万能的,如果有冲突还是要人工参与的。
lz要完成全自动的?
#2
两个文档间的冲突部分如何来处理,这个算法是没有问题的
关键问题是如何同时遍历两个xml文档并且节点层次要保持同步,以达到同层次节点一一比较的目的。
是要全自动的,并且通用。因为每一类xml文档的文档结构都不一样。
大侠们出来啊~
关键问题是如何同时遍历两个xml文档并且节点层次要保持同步,以达到同层次节点一一比较的目的。
是要全自动的,并且通用。因为每一类xml文档的文档结构都不一样。
大侠们出来啊~
#3
先把XML都格式化成统一的格式,然后文本合并。准确率就靠天意了。
#4
文本合并。。也太不靠谱了吧
如果是<A name =1 valu =2/>
这种节点咋整。。。
由于是要做搜索多个网域的文件并合并,得到的结果还会用作很多操作
所以必须有准确率要求的,要是简单的合并起来那就没有意义了
如果是<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文档的结构肯定是相同的
如果这两个节点名相同,如
<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
while(1){
访问完1个文档,保存节点地址,去访问第2个文档,保存节点地址,对比
}
提供个思路
#11
我在手册中发现,xinclude有几个功能函数可以实现拼接
#12
<node attr="1"/>
<node attr="2"/>
这个你怎么合并?
<node attr="2"/>
这个你怎么合并?
#13
#14
没想到隔了这么久,还有大虾拔刀相助,虽然现在不做这个了,但是还是非常感谢
#15
其实当时用的是LIBXML,TINYXML我这会儿才开始学,希望能有帮组,多谢了