My favorites | Sign in
Project Home Downloads Wiki Issues Source
Project Information
Members
Links

cppe4x是一个简单的C++跨平台XML解析器,基于DOM和XPath方式实现,其目标是快速的构建xml应用。

cppe4x非常适合快速的构建测试程序以及配置文件的读写。当前仅支持ANSI和UTF8格式的XML文件。同时,cppe4x在Microsoft Windows平台下会自动进行utf8与ansi编码的双向转换,简化使用习惯。

cppe4x最初的目标是构建与ActionScript3中的E4X语法类似的接口,但由于C++与AS3语法的巨大差异,目前的cppe4x无法完全实现该目标。尽管如此,cppe4x还是尽量的保持了操作的简洁和有效性。

请从svn获取最新版本。

5/4/2010
  增加vc10 ( vs2010) 的工程文件.
21/01/2010
  现在,解析时,attribute允许"="前后有空格。 以便兼容flash。
  运行效率小幅提升。
  main.cpp被修改为utf-8编码,以便在linux下可以正常显示中文。
29/12/2009
  移除parser时可能产生的E4XException异常。
20/12/2009
  stable version with comments.

test code

void test_create_new_file()
{
	std::cout << "---------------------" << __FUNCTION__ << std::endl;
	E4XDocument doc;
	doc["root"]["item"]["@type"]="fist";
	doc["root"]["item"][1]["@type"]="second";
	for( int i = 0; i< 10; i++)
	{
		doc["root"]["item"][i%2]["data"][i/2] = i;
	}
	doc.saveFile( "create_test.xml");
}


void test_read_write_file()
{
	std::cout << "---------------------" << __FUNCTION__ << std::endl;
	E4XDocument doc;
	if( doc.loadFile("sample.xml"))
	{
		E4XCellRef refImage = doc["rss"]["channel"];
		std::cout << "title: " << refImage["title"].toString() << std::endl;
		std::cout << "link: " << refImage["link"].toString() << std::endl;
		std::cout << "description: " << refImage["description"].toString() << std::endl;

		E4XCellRef channel = doc["rss"]["channel"][0].copy();
		E4XIterator items = doc["rss"]["channel"]["item"];

		E4XCellRef cell = doc["rss"]["channel"]["item"]["subItem"].getCell();
		std::cout << cell.toAnsiXmlString() << std::endl;
		E4XIterator subItem(doc["rss"]["channel"]["item"]["subItem"]);
		subItem["@hello"] =  3;

		std::string str = subItem.toAnsiXmlString();
		std::cout << str << std::endl;



		while( items.hasNext())
		{
			E4XCellRef cell = items.next();
			cell["description"].remove();
			// or items.next()["description"].getCell().removeFromParent();
			std::cout << cell["title"].toString() << std::endl;
		}

		doc["rss"][0].appendChild( channel);

		doc.saveFile("sample_output.xml");
	}
	else
	{
		std::cout << "parser file error." << std::endl;
	}
}

void test_parse()
{
	std::cout << "---------------------" << __FUNCTION__ << std::endl;

	E4XElement element;
	if( element.parse("<invoke name=\"PlayMovie\" returntype=\"xml\"><arguments ><string>here is a string</string></arguments></invoke>"))
	{
		element["arguments"].getCell().setValue( "<invoke name=\"PlayMovie\" returntype=\"xml\"><arguments ><string>中文测试字符串</string></arguments></invoke>");
		std::cout << element["@name"].toString() << std::endl;

		std::cout << element.toAnsiXmlString() << std::endl;
		E4XDocument doc;
		doc.parse( element.toXmlString().c_str() );
		std::cout << doc.toAnsiXmlString() << std::endl;
		std::cout << element["arguments"]["string"].toString() << std::endl;

		std::cout << element["arguments"].toString() << std::endl;

		E4X::E4XIterator it = element["arguments"][""];
		while( it.hasNext())
		{
			E4X::E4XCellRef cell = it.next();
			std::cout << cell.getName() << std::endl;
		}
	}
	else
	{
		std::cout << "parse 1 error" << std::endl;
	}

	E4XElement http;
	if( http.parseAnsi("<http_xml_request http=\"http://dy.gougou.com/top_movie?key=功夫&num=12&t=200\" />"))
	{
		std::cout << http["@http"].toString() << std::endl;
		std::cout << http.toAnsiXmlString() << std::endl;
	}
	else
	{
		std::cout << "parse 2 error" << std::endl;
	}

}
Powered by Google Project Hosting