我在编写这段代码时得到了一些帮助。目前,代码所做的是打印出文件中差异的 id 编号,即新的与旧的相比,添加、删除或保持不变。
但是我想要做的是返回节点中的信息,当它只出现在 new.xml 中时,而不仅仅是 ID(即标题、位置、日期)。
我可以从谷歌找到的最好的猜测是使用(不知道如何实现):xpath->getAncestor
我当前的代码
#include <set>
#include <string>
#include <sstream>
#include <iostream>
#include <algorithm>
#include "include/pugixml.hpp"
#define con(m) std::cout << m << '\n'
#define err(m) std::cerr << m << std::endl
using str_set = std::set<std::string>;
int main()
{
pugi::xml_document doc;
str_set a;
doc.load_file("old.xml");
// fill set a with just the ids from file a
for(auto&& node: doc.child("site_entries").children("entry"))
a.emplace(node.child("id").text().as_string());
str_set b;
doc.load_file("new.xml");
// fill set b with just the ids from file b
for(auto&& node: doc.child("site_entries").children("entry"))
b.emplace(node.child("id").text().as_string());
// now use the <algorithms> library
str_set b_from_a;
std::set_difference(a.begin(), a.end(), b.begin(), b.end()
, std::inserter(b_from_a, b_from_a.begin()));
str_set a_from_b;
std::set_difference(b.begin(), b.end(), a.begin(), a.end()
, std::inserter(a_from_b, a_from_b.begin()));
str_set a_and_b;
std::set_intersection(a.begin(), a.end(), b.begin(), b.end()
, std::inserter(a_and_b, a_and_b.begin()));
for(auto&& v: a)
con("a : " << v);
con("");
for(auto&& v: b)
con("b : " << v);
con("");
for(auto&& v: b_from_a)
con("b_from_a: " << v);
con("");
for(auto&& v: a_from_b)
con("a_from_b: " << v);
con("");
for(auto&& v: a_and_b)
con("a_and_b : " << v);
con("");
}
这是一个示例 XML:
<?xml version="1.0" encoding="ISO-8859-1" ?> <site_entries> <entry> <id><![CDATA[946757316]]></id> <url><![CDATA[http://www.site.co.uk/cgi-bin/tr.cgi?tid=752276]]></url> <content><![CDATA[Specialized Dolce Sport 27 Speed]]></content> <title><![CDATA[Bike]]></title> <price><![CDATA[£600]]></price> <date><![CDATA[01-AUG-13]]></date> <display_reference><![CDATA[214683-50142933_370647]]></display_reference> <location><![CDATA[City of London]]></location> <category><![CDATA[Bike]]></category> </entry> <entry> <id><![CDATA[90007316]]></id> <url><![CDATA[http://www.site.co.uk/cgi-bin/tr.cgi?tid=70952276]]></url> <content><![CDATA[Giant Sport Offroad Bike]]></content> <title><![CDATA[Bike]]></title> <price><![CDATA[£100]]></price> <date><![CDATA[11-AUG-15]]></date> <display_reference><![CDATA[2146433-50142933_370647]]></display_reference> <location><![CDATA[City of London]]></location> <category><![CDATA[Bike]]></category> </entry> </site_entries>
我将获得数十万个总结果和数万个添加条目,因此我正在寻找实现这一目标的最有效方法。