上一篇,写了Liquid Xml Studio 生成C++代码的过程。
然而,一方面,我时刻没有忘记,在wikipedia上,给程序员用的软件,最贵的就是Altova 的系列产品。
Altova XMLSpy是其产品中一个。
本来不想再调研这个。因为,Liquid Xml Studio已经提供了可以令我满意的效率,而且,我也找到了破解版本的Liquid Xml Studio。
但事实证明,一分钱一分货。看看,我的文件是这样的:
my.xml
<?xml version="1.0" standalone="yes"?> <NewDataSet> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="NewDataSet" msdata:IsDataSet="true"> <xs:complexType> <xs:choice maxOccurs="unbounded"> <xs:element name="Table" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="Id" type="xs:double" minOccurs="0"/> <xs:element name="ParentId" type="xs:double" minOccurs="0"/> <xs:element name="MachineName" type="xs:string" minOccurs="0"/> <xs:element name="TaskName" type="xs:string" minOccurs="0"/> <xs:element name="Descs" type="xs:string" minOccurs="0"/> <xs:element name="Percents" type="xs:double" minOccurs="0"/> <xs:element name="Status" type="xs:string" minOccurs="0"/> <xs:element name="StartTime" type="xs:dateTime" minOccurs="0"/> <xs:element name="EndTime" type="xs:dateTime" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <Table> <Id>1</Id> <ParentId>0</ParentId> <MachineName>Bruce</MachineName> <TaskName>Bruce</TaskName> <Descs>Cambell</Descs> <Percents>100</Percents> <Status>Succeed</Status> <StartTime>1957-09-06T00:00:00</StartTime> <EndTime>2000-07-02T00:00:00</EndTime> </Table> <Table> <Id>2</Id> <ParentId>1</ParentId> <MachineName>Cindy</MachineName> <TaskName>Cindy</TaskName> <Descs>Haneline</Descs> <Percents>35</Percents> <Status>Succeed</Status> <StartTime>1973-12-23T00:00:00</StartTime> <EndTime>1996-11-06T00:00:00</EndTime> </Table> </NewDataSet>
要注意,这是一个StandAlong文件。
所以,我的方法是,先择XSD从中分离出来:
my.asd
<?xml version="1.0" encoding="utf-8"?> <!--Created with Liquid XML Studio Developer Edition 9.0.11.3078 (http://www.liquid-technologies.com)--> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="NewDataSet"> <xsd:complexType> <xsd:choice maxOccurs="unbounded"> <xsd:element name="Table" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="Id" type="xsd:double" minOccurs="0"/> <xsd:element name="ParentId" type="xsd:double" minOccurs="0"/> <xsd:element name="MachineName" type="xsd:string" minOccurs="0"/> <xsd:element name="TaskName" type="xsd:string" minOccurs="0"/> <xsd:element name="Descs" type="xsd:string" minOccurs="0"/> <xsd:element name="Percents" type="xsd:double" minOccurs="0"/> <xsd:element name="Status" type="xsd:string" minOccurs="0"/> <xsd:element name="StartTime" type="xsd:dateTime" minOccurs="0"/> <xsd:element name="EndTime" type="xsd:dateTime" minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema>
但是,经过几次测试,我明白了,Liquid Xml Studio生成的代码,无法解析这样的文件。
因为它说找不到
urn:schemas-microsoft-com:xml-msdata找了一会,没有找到解决的办法。
停了一下,我想到,贵要有贵的道理。要试试Altova XMLSpy
果然没有让我失望。看来奥地利人,要399刀,是有底气的。
好了,开始讲解:
************************************
对了,先是试用了Altova XMLSpy 2012版本,发现,这个版本,太智能,以致于出现了我不希望他瞎聪明的地方,
再加上,我希望能用vc6 或是 vc2003编译通过,所以,最终我选用的是Altova XMLSpy 2007。很重要啊。
<?xml version="1.0" standalone="yes"?> 在2012里会被改成:
<?xml version="1.0" encoding="utf-8"?>
而2007中无此错误——正合吾意啊。
************************************
void Example() { CApTaskMonitorDoc doc; CNewDataSetType root = doc.Load(_T("E:\\work2\\AutoPack\\08_XML\\XMLFile\\xml\\ApTaskMonitor.xml")); CTableType curtable= root.GetTable(); //int nCurID = curtable.getf // ... CTableType TaskItem= root.NewTable(); TaskItem.AddId(9); TaskItem.AddParentId(4); TaskItem.AddMachineName(_T("haostep")); TaskItem.AddTaskName(_T("测试任务")); TaskItem.AddDescs(_T("")); TaskItem.AddPercents(0); TaskItem.AddStatus(_T("NoStart")); TaskItem.AddStartTime(_T("2010-12-30T12:45:37")); TaskItem.AddEndTime(_T("2010-12-30T12:45:37")); root.AddTable(TaskItem); doc.Save(_T("E:\\work2\\AutoPack\\08_XML\\XMLFile\\xml\\ApTaskMonitor1.xml"), root); }
另外,最喜欢XMLSpy之处,是因为它的代码,没有加密。而liquid太小家子气,把所有的xml解析库,都加了密,没有licesence就无法使用。