XML常用的工具_LiquidXMLStudio映射XML到C++代码

人类社会,据马克思所说,三要素:

生产力,生产关系和财富再分配。


虽然说,总体来说,我个人认为,财富再分配,是核心是重,但对于吊丝来说,还是关注一下生产力吧。至于爸爸是李刚刚的,考虑一下基它的吧。


生产力的核心,就是工具。


所以,做为一个程序员,掌握工具,是很重要的。以前我招人,也是理论和工具并重。一个不注重工具的人,往往是一个不注重实践的人。赵括理论还不错,但打起仗来,就不成。其中一个原因,就是实践不够,或是不重视实践。


这里我总结一下我自己的心理。如果你不幸进来看到我写的文字,先忍一下我的罗索吧。


XML的工具,最近我用了用,几个XMLSpy和LiquidXMLStudio是主要用的两种。

********************

Let's Start:

先看一个网页:

http://en.wikipedia.org/wiki/Comparison_of_XML_editors

这也是我的习惯。

不过这里面的列,不是很全。

我是希望有几个方面:

* 能生成C++代码,这个功能在这里被称做:map。map的意思是说从xsd映射到代码。当然,也有其它的含义,但一般不会用map,比如xml to xml, xml to DB. 都会写清楚,但只有map,现在看来就是这个意思。之所以,要生成C或C++代码,是因为我底层的解析器就是用C写的。不想在这个层面来转换。

因为XML本身,才是接口信息的承载。没必要,再加入一种新语言。

* 如果生成的代码,是基于开源的XML库就更好的。

目前来看,经过调研,目前最好的XML开源库,就是libxml2和xerces. 不过,总体来说,如果我自己来做,会选libxml2.

因为这个库是基于C的,也便于跨平台。

* 其它的XML自动化编辑工具。这些就不用说了。


但事实上,没有找到达到这种要求的编辑器。


除XMLSpy 和 LiquidXMLStudio 以外,发现还有两个比较强大,其实,哪个强大,你只需要在这里看看哪个最贵就可以了。

http://en.wikipedia.org/wiki/Comparison_of_XML_editors


不过,我是没看懂,为什么有的那么贵。看来,程序员,总是站在程序员的角度来看世界,里面最贵的MadCap Flare,比LiquidXMLStudio贵了一个量级。

好象MadCap FlareXMLSeedXML Schema Editor

类似,都是用于非程序员的。他们贵的原因,都是因为真真正正在用XML的含义:完备性的文档(不是程序员的叫法:可扩展性ML)。是给不是程序员的人用的,看来也说明,程序员普遍都是吊丝。外国可能也是如此。


哈。吊丝们都回回神,不多说了,所以关注点来是回到XMLSpy 和 LiquidXMLStudio。(为什么我用吊丝?因为QQ拼音,因为高大上的原因,打不出来这个词)。

让我吃惊的是,XMLSpy好贵。快赶上非程序员用的。

但,我这没有最新版的2014,据说也是可以完成XML到C++的MAP.


所以,只用到了LiquidXMLStudio。

LiquidXMLStudio 可以映射各种语言,只是我用到了C++。


至于如何操作,我不写了,看这个页面:

http://www.liquid-technologies.com/Liquid-Products/LearnAbout/XmlDataBinding.aspx


没有被墙。


忘了说,这是我最关注的一个要点

* 没有被墙。

下一个,当然是,有D版的。

然后,最好有vs 2003以下版本的。能在XP运行的。


以上就是我的要求。

***********************************************************************

经过调研,没有达到要求的,暂时。

但xmlstudio2011 最合适,因为有破解,可以生成C++代码。

用的虽然不是开源的XML库,但也够用了。

***********************************************************************

以下是示例代码,最关键是这几句

		BookStoreLib::CBookstorePtr spBS = BookStoreLib::CBookstore::CreateInstance();
		BookStoreLib::CBookTypePtr spBook = spBS->GetBook()->Add();
		spBook->SetTitle(_T("The Autobiography of Benjamin Franklin"));
		spBook->SetPrice(8.99);
		spBook->SetPublicationdate(LtXmlLib12::CDateTime(1981, 5, 11));
		spBook->SetISBN(_T("1-861003-11-0"));
		spBook->GetAuthor()->SetFirst_name(_T("Benjamin"));
		spBook->GetAuthor()->SetLast_name(_T("Franklin"));
		spBook->SetGenre(_T("autobiography"));
		std::tstring strXml = spBook->ToXml();

1. 打开一个XSD,然后:打开向导:

2. 选择C++语言


3. 可以修改一些信息,可选



4. 填加一个测试用的XML文件。

 

5. OK 了,打开工程后

 


6. 打开工程,进行一点编码。Liquid会自动创建一个chm帮助文档,这个我太喜欢了。

照着下面这样,你就可以生成一个可以工作的例子了。

对了,我所选的xml是在示例工程下面。

D:\Program Files (x86)\Liquid Technologies\Liquid XML 2014\Examples\BookStore\Schemas\BookStore.xsd

D:\Program Files (x86)\Liquid Technologies\Liquid XML 2014\Examples\BookStore\Data Files\BookStoreSample.xml



**********************************************

		// create an instance of the class to load the XML file into
		bs::CBookstorePtr elm = bs::CBookstore::CreateInstance();

		// load the xml from a file into the object (the root element in the
		// xml document must be <bookstore>.
		elm->FromXmlFile(lpctFilename);

//--------<haoyujie>--------------
		bs::CBookTypePtr spBook = elm->GetBookCol()->Add();
		spBook->SetTitle(_T("The Autobiography of Benjamin Franklin"));
		spBook->SetPrice(8.99);
		spBook->SetPublicationdate(LtXmlLib12::CDateTime(1981, 5, 11));
		spBook->SetISBN(_T("1-861003-11-0"));
		spBook->GetAuthor()->SetFirst_name(_T("Benjamin"));
		spBook->GetAuthor()->SetLast_name(_T("Franklin"));
		spBook->SetGenre(_T("autobiography"));
//--------</haoyujie>--------------


*********************************************

#include "stdafx.h" 
#include "../BookStoreLib.h" 
#include "../BookStoreLib/Bookstore.h" 

using namespace LtXmlLib12;

// forward declarations
void SimpleTestBookStoreLibCBookstore(LPCTSTR);
void WriteTest();
void ReadTest();

/// <summary>
/// The main entry point for the application.
/// </summary>
int main(int argc, char* argv[])
{
	WriteTest();
	ReadTest();

	_tprintf(_T("\n\nPress a key to finish"));
	getchar();

	return 0;
}
		
void WriteTest()
{
	try
	{
		_tprintf(_T("\nCreating an XML document...\n"));

		// to create the XML document from scratch
		BookStoreLib::CBookstorePtr spBS = BookStoreLib::CBookstore::CreateInstance();
		BookStoreLib::CBookTypePtr spBook = spBS->GetBook()->Add();
		spBook->SetTitle(_T("The Autobiography of Benjamin Franklin"));
		spBook->SetPrice(8.99);
		spBook->SetPublicationdate(LtXmlLib12::CDateTime(1981, 5, 11));
		spBook->SetISBN(_T("1-861003-11-0"));
		spBook->GetAuthor()->SetFirst_name(_T("Benjamin"));
		spBook->GetAuthor()->SetLast_name(_T("Franklin"));
		spBook->SetGenre(_T("autobiography"));
		std::tstring strXml = spBook->ToXml();

		_tprintf(_T("\nThis is the XML:\n%s"), strXml.c_str());
	}
	catch (CLtException& e)
	{
		// Note : exceptions are likely to contain inner exceptions
		// that provide further detail about the error, GetFullMessage
		// concatantes the messages from them all.
		_tprintf(_T("Error - %s\n"), e.GetFullMessage().c_str());
	}
}

void ReadTest()
{
	try
	{
		_tprintf(_T("\nReading an existing XML document...\n"));

		// to create the XML document from scratch
		BookStoreLib::CBookstorePtr spBS = BookStoreLib::CBookstore::CreateInstance();
		spBS->FromXmlFile(_T("..\\..\\..\\BookStoreSample.xml"));

		for (BookStoreLib::CBookTypeCol::iterator itr = spBS->GetBook()->begin();
			 itr != spBS->GetBook()->end();
			 itr++)
		{
			BookStoreLib::CBookTypePtr spBook = *itr;

			_tprintf(_T("Book Title           %s\n"), spBook->GetTitle().c_str());
			_tprintf(_T("    Price            %f\n"), spBook->GetPrice());
			_tprintf(_T("    Author           %s %s\n"), spBook->GetAuthor()->GetFirst_name().c_str(), spBook->GetAuthor()->GetLast_name().c_str());
			if (spBook->IsValidPublicationdate())
				_tprintf(_T("    Publicationdate  %s\n"), spBook->GetPublicationdate().ToString().c_str());
			else                    
				_tprintf(_T("    Publicationdate  Not Listed\n"));
			if (spBook->IsValidISBN())
				_tprintf(_T("    ISBN             %s\n"), spBook->GetISBN().c_str());
			else                    
				_tprintf(_T("    ISBN             Not Listed\n"));
			if (spBook->IsValidGenre())
				_tprintf(_T("    Genre            %s\n"), spBook->GetGenre().c_str());
			else                    
				_tprintf(_T("    Genre            Not Listed\n"));
		}
	}
	catch (CLtException& e)
	{
		// Note : exceptions are likely to contain inner exceptions
		// that provide further detail about the error, GetFullMessage
		// concatantes the messages from them all.
		_tprintf(_T("Error - %s\n"), e.GetFullMessage().c_str());
	}
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: C语言中,可以通过解析XML文件将其转化为结构体的方式进行操作。下面是一个简单的示例: 首先需要确定XML文件的结构,例如XML文件如下所示: ```xml <student> <name>小明</name> <age>18</age> <gender>男</gender> </student> ``` 为了表示该XML文件的结构,我们可以创建一个对应的结构体如下: ```c typedef struct { char name[20]; int age; char gender[5]; } Student; ``` 接下来,我们需要使用C语言中的XML解析库进行解析。常用XML解析库有libxml2和expat等,这里我们以libxml2为例。首先需要确保在C代码中包含libxml2的头文件: ```c #include <libxml/parser.h> ``` 然后,可以编写一个函数来解析XML文件并将其转化为结构体: ```c #include <libxml/parser.h> #include <libxml/tree.h> int parseXMLFile(const char* filename, Student* student) { xmlDocPtr doc; xmlNodePtr cur; // 解析XML文件 doc = xmlParseFile(filename); if (doc == NULL) { printf("无法解析XML文件\n"); return -1; } // 获取根节点 cur = xmlDocGetRootElement(doc); if (cur == NULL) { printf("XML文件为空\n"); xmlFreeDoc(doc); return -1; } // 遍历节点,获取结构体成员的值 for (cur = cur->xmlChildrenNode; cur != NULL; cur = cur->next) { if (xmlStrcmp(cur->name, (const xmlChar *)"name") == 0) { xmlChar* value = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); strcpy(student->name, (char*)value); xmlFree(value); } else if (xmlStrcmp(cur->name, (const xmlChar *)"age") == 0) { xmlChar* value = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); student->age = atoi((char*)value); xmlFree(value); } else if (xmlStrcmp(cur->name, (const xmlChar *)"gender") == 0) { xmlChar* value = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); strcpy(student->gender, (char*)value); xmlFree(value); } } // 释放资源 xmlFreeDoc(doc); return 0; } ``` 最后,在主函数中调用该函数进行解析和转化: ```c int main() { Student student; if (parseXMLFile("student.xml", &student) == 0) { printf("姓名:%s\n", student.name); printf("年龄:%d\n", student.age); printf("性别:%s\n", student.gender); } return 0; } ``` 这样,我们就可以将XML文件中的数据解析转化为结构体,并进行相应的操作和处理。当然,以上只是一个简单的示例,实际应用中可能会更加复杂,需要根据XML文件的结构和需求进行相应的处理和设计。 ### 回答2: 将XML转化为结构体是一种常见的数据处理需求。通过将XML文件的内容解析并映射到结构体的属性中,可以方便地操作和处理数据。 在C语言中,可以使用第三方库,如libxml2来实现XML转化为结构体的功能。首先需要引入相关的头文件,并初始化libxml2库。 接下来,可以通过打开XML文件并解析其内容,将XML节点的值映射到结构体中。通过使用libxml2库提供的API函数,可以方便地遍历XML文件的各个节点,获取其属性和子节点的值。 在遍历XML节点的过程中,可以根据自己的需求创建对应的结构体对象,并将XML节点的值通过赋值操作映射到结构体的属性中。 最后,可以根据需要对结构体对象进行进一步的操作和处理,如将结构体保存到数据库或进行其他计算。 需要注意的是,XML和结构体之间的映射要根据实际情况进行处理,需要考虑XML文件的结构和结构体的定义。 在编写代码时,应该注意处理异常情况,如XML文件格式错误或结构体定义不匹配等,以保证程序的稳定性。 总之,通过使用libxml2库,我们可以很方便地将XML转化为结构体,实现XML文件的解析和数据处理。这种方法在C语言中是比较常见和有效的一种实现方式。 ### 回答3: XML转化为结构体,是将XML格式的数据转化为结构体的形式,方便程序进行处理和使用。这一过程可以通过使用各种XML库或工具来实现。 首先,需要定义一个结构体,结构体的成员变量应该与XML中的元素或属性对应起来。例如,如果XML中有一个名为"name"的元素,那么结构体中应该有一个名为"name"的成员变量。 然后,通过XML库或工具加载XML文件,并将其解析为一个DOM树或其他数据结构。接着,遍历解析后的XML数据,并根据各个节点的名称和属性值,将数据赋值给对应的结构体成员变量。 在遍历的过程中,可能需要进行一些数据类型转换,例如将字符串类型的属性值转化为整数或浮点数类型。可以根据实际需要,在结构体中定义不同数据类型的成员变量。 最后,将填充好数据的结构体传递给其他部分的程序进行进一步的处理或使用。 需要注意:XML的结构可能会比较复杂,包含嵌套的子元素、多层次的节点等。在解析和转化过程中,需要考虑如何处理这些结构,以及可能出现的异常情况。 总之,通过XML转化为结构体,可以方便地将XML数据转化为程序所需要的数据形式,提高代码的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值