65.9K
CodeProject 正在变化。 阅读更多。
Home

周期性 XML 差异检查器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (2投票s)

2010年1月30日

CPOL

2分钟阅读

viewsIcon

18001

downloadIcon

141

它会重复检查某些对象的 XML,并显示与先前结果的差异。

XmlWatch

引言

本文介绍如何周期性地监视 XML 类型数据。这对于监视实时变化的数据非常有用(这在远程调试或 QA 工具中很常见)。

XML 有效地表示树形结构数据,因此 XmlWatch 使用 TreeView 来显示树形结构数据。它支持使用加号/减号图标轻松展开/折叠树节点中的特定部分。

背景

这个程序的想法源自 GNU watch,它用于随着时间的推移监视特定程序的输出。

http://support.microsoft.com/kb/317597 也对将 XML 放入 TreeView 中有所帮助。

工作原理(简述)

  • XmlWatch 不会显示所有的 XML 属性。它只显示节点的名称和值类型数据。但您可以修改 XmlWatch 以查看所有的 XML 属性。
  • XmlWatch 不需要 XML 数据是格式良好的,但数据应该是有效的 XML 文档。否则,XML 解析器会抛出异常,GUI 将不会显示任何内容。
  • 时间周期在 Form1 UI 代码中硬编码。当前定时器设置为每秒钟触发一次,因此 XML 每秒钟被检索一次。
  • 如果发生部分更改,则只会突出显示更改的部分。并且当不再更改时,高亮会平滑消失。用户可以轻松地看到差异。

Using the Code

ISubjectSimpleSubject 是提供 XML 数据给 UI 类的接口类。下面的简单示例展示了如何使用这个程序。您只需要重写 Run() 方法即可。如果您想使用回调类型实现,可以使用 ISubject 接口...

public class SimpleTest : SimpleSubject
{
    private int count = 0;

    public override XmlDocument Run()
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml("<child>It is test</child><child2>" + count + "</child2>");
        count += 1;
        return doc;
    }
} 

...而我们所需要做的就是将该 Subject 类绑定到 UI。目前,这是通过 UI 周期性使用的静态对象 Program.XmlSupplier 完成的。您可以修改下面的代码以设置您自己的 XML 数据

public static ISubject XmlSupplier = 
	new SimpleTest(); // use your own XmlSupplier which implements ISubject

XmlWatch 的一个很好的用途是与 boost::serialization 结合使用。因为 boost::serialization 支持 XML 导出,所以用户可以将她/他的大型结构化数据转换为 XML,并使用 XmlWatch 周期性地监视它。下面的示例代码展示了这一点

struct inner
{
    int a,b,c;
};
struct outer
{
    int aa,bb;
    inner indata;
};

BOOST_SERIALIZATION_SPLIT_FREE(inner);
BOOST_SERIALIZATION_SPLIT_FREE(outer);

namespace boost { namespace serialization {
template<class> 
void save(Archive &ar, const inner &data, const unsigned int version)
{
    ar & BOOST_SERIALIZATION_NVP(data.a);
	ar & BOOST_SERIALIZATION_NVP(data.b);
	ar & BOOST_SERIALIZATION_NVP(data.c);
}

template<class>
void save(Archive &ar, const outer &data, const unsigned int version)
{
    ar & BOOST_SERIALIZATION_NVP(data.aa);
	ar & BOOST_SERIALIZATION_NVP(data.bb);
	ar & BOOST_SERIALIZATION_NVP(data.indata);
}
}}

// in other area of code ...
int main(void)
{
	ofstream fout("output.xml");
	boost::archive::xml_oarchive oa(fout, boost::archive::no_header);

	outer data;
	data.aa=1;
	data.bb=3;
	data.indata.a = data.indata.b = data.indata.c = 5;

	oa << BOOST_SERIALIZATION_NVP(data);
}

包含在源代码中的示例测试 C++ 代码需要 boost 库,可以从 这里 下载。

关注点

颜色动画的实现速度慢且闪烁。我开启了双缓冲,但当显示 200+ 行时,它无法解决这个问题。

历史

  • 2010 年 1 月 30 日:初始发布
© . All rights reserved.