上一篇,写了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就无法使用。