我用TXMLDocument组件来读取一个XML文件,并用IXMLDOMNode定义了一个根节点ndRoot,然后:
XML1.LoadFromFile( 'Setting.xml' );
XML1.Active := True;
ndRoot := (XML1.DocumentElement.DOMNode as IXMLDOMNodeRef).GetXMLDOMNode; for i:=1 to 8 do
begin
g_aryStrTag[i][1] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/StartStop/@TagName' ).nodeValue;
g_aryStrTag[i][2] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Flow/@TagName' ).nodeValue;
g_aryStrTag[i][3] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Type1/@TagName' ).nodeValue;
g_aryStrTag[i][4] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Type2/@TagName' ).nodeValue;
g_aryStrTag[i][5] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Group/@TagName' ).nodeValue;
g_aryStrTag[i][6] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Total/@TagName' ).nodeValue;
g_aryStrTag[i][7] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Archive/@TagName' ).nodeValue;
g_aryStrTag[i][8] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Spare1/@TagName' ).nodeValue;
end;XML文件中有8个Tank节点,上面的程序在一些电脑上可以正常运行,但在有些电脑上报错,我跟踪了一下,发现在出错电脑上的Tank节点的索引是以0开始,而不是1,即Tank[1]不是第一个Tank节点,而是第二个,这样当i循环到8时,节点Tank[8]是不存在的,因此报错。
我想问一下,MSXML对XML文件的读取有不同的方式吗?怎样才能将不同电脑的XML设置成一样的读取方式?
XML1.LoadFromFile( 'Setting.xml' );
XML1.Active := True;
ndRoot := (XML1.DocumentElement.DOMNode as IXMLDOMNodeRef).GetXMLDOMNode; for i:=1 to 8 do
begin
g_aryStrTag[i][1] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/StartStop/@TagName' ).nodeValue;
g_aryStrTag[i][2] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Flow/@TagName' ).nodeValue;
g_aryStrTag[i][3] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Type1/@TagName' ).nodeValue;
g_aryStrTag[i][4] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Type2/@TagName' ).nodeValue;
g_aryStrTag[i][5] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Group/@TagName' ).nodeValue;
g_aryStrTag[i][6] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Total/@TagName' ).nodeValue;
g_aryStrTag[i][7] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Archive/@TagName' ).nodeValue;
g_aryStrTag[i][8] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Spare1/@TagName' ).nodeValue;
end;XML文件中有8个Tank节点,上面的程序在一些电脑上可以正常运行,但在有些电脑上报错,我跟踪了一下,发现在出错电脑上的Tank节点的索引是以0开始,而不是1,即Tank[1]不是第一个Tank节点,而是第二个,这样当i循环到8时,节点Tank[8]是不存在的,因此报错。
我想问一下,MSXML对XML文件的读取有不同的方式吗?怎样才能将不同电脑的XML设置成一样的读取方式?
解决方案 »
- delphi如何获取comobobox的item个数?谢谢!
- dbadvgrid 怎么实现滚动条与数据同步
- 如何将车衡(地磅)的外面那一电子显示屏(LCD顾客显示屏)的数据在程序中自己发送出去显示??
- 求字符串转换方法,进来看看
- 谁能说一下,Tsession与Tdatabase的区别,分别有什么作用!我一直弄不清楚
- 如何批量清空TabSheet里面的所有edit组件?
- delphi中如何实现特定的一个或几个form中 使combox失去对鼠标滚轮的响应
- 网格问题
- 如何用Quick Report 实现NT/2000/XP下的票据打印?
- 怎样从一个应用程序某一个form的Name得到该Form的实例,
- Web中的JavaScript怎么监听不到ocx控件中的自定义事件,应该如何设置?
- 简单问题 可是就是不对请教 小弟刚学Delphi
uses
msxml, ComObj;const
XML_DOC = '<?xml version="1.0" encoding="UTF-8"?>' +
'<root><item>budded</item><item>vista</item></root>';
// msxml parser 4.0
ProgID_FreeThreadedDOMDocument30 = 'Msxml2.FreeThreadedDOMDocument.3.0';
// msxml parser 4.0
ProgID_FreeThreadedDOMDocument40 = 'Msxml2.FreeThreadedDOMDocument.4.0';
// msxml parser 6.0
ProgID_FreeThreadedDOMDocument60 = 'Msxml2.FreeThreadedDOMDocument.6.0';{$R *.dfm}procedure TForm8.msxml31Click(Sender: TObject);
begin
Caption := ParseXML(ProgID_FreeThreadedDOMDocument30, XML_DOC, 'root/item[1]')
end;procedure TForm8.msxml3Click(Sender: TObject);
begin
Caption := ParseXML(ProgID_FreeThreadedDOMDocument30, XML_DOC, 'root/item[0]')
end;procedure TForm8.msxml41Click(Sender: TObject);
begin
Caption := ParseXML(ProgID_FreeThreadedDOMDocument40, XML_DOC, 'root/item[1]')
end;procedure TForm8.msxml4Click(Sender: TObject);
begin
Caption := ParseXML(ProgID_FreeThreadedDOMDocument40, XML_DOC, 'root/item[0]')
end;procedure TForm8.msxml61Click(Sender: TObject);
begin
Caption := ParseXML(ProgID_FreeThreadedDOMDocument60, XML_DOC, 'root/item[1]')
end;procedure TForm8.msxml6Click(Sender: TObject);
begin
Caption := ParseXML(ProgID_FreeThreadedDOMDocument60, XML_DOC, 'root/item[0]')
end;function TForm8.ParseXML(const ProgID, XMLDoc, Path: String): String;
var
FIntf: IXMLDOMDocument;
FNode: IXMLDOMNode;
begin
Result := '';
FIntf := CreateOleObject(ProgID) as IXMLDOMDocument;
if Assigned(FIntf) and FIntf.loadXML(XMLDoc) then
begin
FNode := FIntf.selectSingleNode(Path);
if Assigned(FNode) then
Result := FNode.text;
end;
end;
结果我就不说了,自己看看去吧
XMLDataBind自动生成xml的接口