|
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;
}
}
|