我想用adoquery对A表进行查询,查询后把结果集持久化为一个标准的XML文件,以便其它语言使用!
query.SaveToFile生成的是一个非标准的结果集,其它语言均不识别!
恳请大家帮帮忙!
谢谢!
query.SaveToFile生成的是一个非标准的结果集,其它语言均不识别!
恳请大家帮帮忙!
谢谢!
解决方案 »
- TClientDataSet 动态创建LookUp字段
- 我想用DELPHI访问远程数据库,请问都有什么方法?各有什么优缺点?
- 用QR制作动态报表的问题
- 迷茫的程序人生!CSDN 上的是朋友的帮我顶一下!进来都有分。
- 如何将access数据导入到sql server中
- 怎样让Edit控件只接受数字的输入?
- 100分难题!求高手解答
- 能不能直接播放MIDI?
- 关于ACCESS数据库备份
- 请问大家一个小问题,Delphi里面有继承吗?TImage从TControl继承的,可是我为什么不能用它的AdjustSize呢?
- 大家帮忙 查找硬盘上的所有asp 文件,并删除指定的内容(200分,不够的话,我可以给你们冲QQ币,现在只有200积分了)
- 如何判断SHU标是否单击(在整个屏幕上)
用 TXMLDocument按照自己的格式要求来处理。
Indicates Microsoft Advanced Data TableGram (ADTG) format.
adPersistADO Value:1
Indicates that ADO's own Extensible Markup Language (XML) format will be used. This value is the same as adPersistXML and is included for backwards compatibility.
adPersistXML Value:1
Indicates Extensible Markup Language (XML) format.
adPersistProviderSpecific Value:2
Indicates that the provider will persist the Recordset using its own format.
简单一点来理解XML,其实就是用标签做属性描述的一个文本规范,只要符合它的属性描述格式和标签配对规则,就是一个标准的XML.
大家都是如何用XML表示结果集的
//正如僵哥说的那样,只要用标签做属性描述的一个文本规范,只要符合它的属性描述格式和标签配对规则,就是一个标准的XML!
1.首先你要确定一个表示结果集的XML结构,例:<?xml version="1.0" encoding="gb2312" ?>
<dataset>
<tablename name="test">
<row>
<ID>"6"</ID>
<Name>"Test"</Name>
<Age>"11"</Age>
</row>
</tablename>
</dataset>
//这个结构是我自己做的,你可以根据需要自定义2.接下来无非就是循环Dataset,来根据其表名、字段名、内容等来拼出这样一个XML for i:=1 to recordset.Count do
begin
//进行拼接XML,注意:一定要用WideString
end;
2、实现方法一为直接“拼字符串”;或者经由XML DOM来生成,可用现在的类库,如MSXML
如果XML文件的内容和数据集能对应上,或者说XML文件中的数据都可以通过SQL直接查询出
也可以在ADOQuery.SaveToFile产生的XML文件基础上,写一个XSLT转换一下
(1)[方法1] 直接创建 IXMLDOMDocument , 例(1)
uses msxml;
var DOC:IXMLDOMDocument;
doc := CoDOMDocument.create;
.....
Doc := nil;
A)doc.load('C:\temp.xml'); //从文件载入
B) 动态创建
var aElement,aElement2: IXMLDOMElement; // [ aNode:IXMLDOMNode ==> .AppendChild() ] //加入版本信息 ‘<?xml version="1.0" ?> ’
doc.AppendChild(doc.CreateProcessingInstruction('xml', 'version="1.0" encoding="GB2312"'));
(*)因为此函数返回结果不包含 'encoding="GB2312"' 故须保存前注意.
//加入根结点
doc.AppendChild(doc.CreateElement('bootDocNode')); //// == aElement
//加入子结点
aElement:=IXMLDOMElement(Doc.DocumentElement.AppendChild(Doc.CreateElement('ChileNode1')));
//设置接点属性
aElement.SetAttribute('ID', '11');
aElement.SetAttribute('Units', '元/m2');
//设置结点内容
aElement.AppendChild(Doc.CreateTextNode('结点内容'));
//子结点添加子结点
aElement2:=IXMLDOMElement(aElement.AppendChild(Doc.CreateElement('Child_ChileNode1')));(2) [方法2] 直接创建 IXMLDocument ( 不是IXMLDOMDocument )
uses XMLIntf,XMLDoc;
var xmlDoc:IXMLDocument; aNode:IXMLNode; s:string; xmlDoc := TXMLDocument.Create(nil);
try
//加入版本信息 ‘<?xml version="1.0" encoding="GB2312" ?> ’
xmlDoc.Active := True; xmlDoc.Version := '1.0'; xmlDoc.Encoding :='GB2312';
//加入根结点
aNode:=xmlDoc.AddChild('bootDocNode');
//加入子结点
aNode:=aNode.AddChild('ChileNode1');
//设置接点属性
aNode.SetAttribute('ID', '22');
aNode.SetAttribute('Units', '元/m2');
//设置结点内容
aNode.Text := '结点内容';
//子结点添加子结点
aNode:=aNode.AddChild('Child_ChileNode1') ;
aNode.Text := 'Child_ChileNod内容';
s := xmlDoc.XML.Text ; // .XML 返回的是 Tstrings
finally
xmlDoc := nil ;
end;(3)利用 XMLDataBinding
I) 准备好XML文件,此XML文件有较强的代表性,保证程序中所用的结点及其关系都存在
II)利用 file-->new-->XML Data Binding
III)创建XML对象
A)v:string; //XML文件内容
Doc : IXMLBudgetDocTyp; //IXMLBudgetDocTyp是XML文件的根结点
Doc := LoadXMLData(v).GetDocBinding('BudgetDoc', TXMLBudgetDocType) as IXMLBudgetDocType;
B)Doc := LoadBudgetDoc('C:\temp.xml');
IV) 应用
Doc.ChildNodes.FindNode('Docfile') as IXMLDocfileType;(4)利用TXMLDocument控件
XMLDocument1.fileName:='C:\temp.xml';
XMLDocument1.active:=true; // XMLDocument1 相当于 Doc(5)XML对象的其他方法
IXMLNodeList.FindNode(NodeName: DOMString): IXMLNode;
IXMLNodeList.FindNode(NodeName, NamespaceURI: DOMString): IXMLNode;
IXMLNodeList.FindNode(ChildNodeType: TGuid): IXMLNode;
IXMLNodeList.FindSibling(const Node: IXMLNode; Delta: Integer): IXMLNode;
IXMLNodeList.First: IXMLNode;
IXMLNodeList.Last: IXMLNode;
... ...
////////////////////////////////////////////////////////////////////////
//例(1)
uses msxml;
doc:IXMLDOMDocument;
budgetdoc:ixmlDomNode;
Rela:IxmlDOMNode;
rs:ixmldomnodelist;//建立或取得XML结点
doc := CoDOMDocument.create;
doc.load('C:\temp.xml');
budgetDoc := doc.selectSingleNode('BudgetDoc');
rela := budgetdoc.SelectSingleNode('Relation'); //创建XML子结点
if not assigned(rela) then
begin
rela := doc.createElement('Relation');
rela.setAttribute('BudgetId',0);
rela.setAttribute('name','名称');
budgetdoc.appendChild(rela);
end;//取子结点(序列)
rs := rela.selectNodes('Rela[@BudgetId="2" and @TaskId="8"]');
for i := 0 to rs.length -1 do
begin
s:= s + rs[i].attributes.getnameditem('NewRate').nodeValue;
end;
rela:=doc.ChildNodes.FindNode('DOMNode') as IxmlDOMNode;//移除子结点
for i := rs.length -1 downto 1 do
rela.removeChild(rs[i])//取父结点
if assigned(anode.parentNode) and (Anode.parentNode.nodeName='Task') then
result := Anode.parentNode;//取属性
DOC.DocumentElement.Attributes['Name']
rela.Attributes['Name']
rs.Nodes[i].Attributes['Name'] Ajob:ixmldomnode;jobs:ixmldomNodeList;
jobs := Ajob.selectNodes('RCJ[@Attrib="'+AAttrib+'"]')