通过XML读取数据的问题

lovelymelon 2008-09-19 09:53:41
从来没接触过 WebService,最近一个项目需要跟另外一个厂家进行接口,读取数据,他们提供的是WebService,文档内容如下:
string GetValue_xml(string xml)
输入输出为xml表示
输入xml定义如下:
每个测点对应的标签为t,参数用标签的属性表示, 属性n表示测点名,属性d表示指定的一个时间,属性b表示开始时间,属性e表示结束时间,属性i表示时间间隔(s)
例如:
<?xml version="1.0" encoding="gb2312"?>
<ts>
<t n=” 13000272_158” d=”2005-5-5 0:0:0” /> 取测点名为sc1在2005-5-5 0:0:0的值
<t n=” 13000272_158” /> 取测点名为sc2的当前值 返回的标签中用属性d表示对应的时间
<t n=” 13000272_158” b=”2005-5-5” e=”2005-5-6” i=”300” /> 取测名为sc3从2005-5-5到2005-5-6每隔5分钟的值
</ts>
属性b e i 必须同时使用

输出xml定义如下:
每个测点对应的标签为t,属性s表示返回状态(0表示成功),子标签v表示值
例如:
<?xml version="1.0" encoding="gb2312"?>
<result>
<t n=” 13000272_158” s=”0”>
<v>….</v>
<v>….</v>
<v>….</v>
</t>
<t n=” 13000272_158” s=”0”>
<v d="2006-5-8 14:30:19">1270.62</v> 取当前值,属性d表示对应时间
</t>
</result>
请问,如何定时读取数据,最好能提供简单的代码及注释,谢谢。
...全文
427 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
qyb5241597 2008-10-16
  • 打赏
  • 举报
回复
正在探縈中
jcw904627538 2008-09-26
  • 打赏
  • 举报
回复
大家回复的积极性真高
hongqi162 2008-09-24
  • 打赏
  • 举报
回复

把这个保存一下,然后导入wsdl的时候选择这个文件

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
<s:element name="HelloWorld">
<s:complexType />
</s:element>
<s:element name="HelloWorldResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
</wsdl:types>
<wsdl:message name="HelloWorldSoapIn">
<wsdl:part name="parameters" element="tns:HelloWorld" />
</wsdl:message>
<wsdl:message name="HelloWorldSoapOut">
<wsdl:part name="parameters" element="tns:HelloWorldResponse" />
</wsdl:message>
<wsdl:portType name="Service1Soap">
<wsdl:operation name="HelloWorld">
<wsdl:input message="tns:HelloWorldSoapIn" />
<wsdl:output message="tns:HelloWorldSoapOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="Service1Soap" type="tns:Service1Soap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="HelloWorld">
<soap:operation soapAction="http://tempuri.org/HelloWorld" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="Service1Soap12" type="tns:Service1Soap">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="HelloWorld">
<soap12:operation soapAction="http://tempuri.org/HelloWorld" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="Service1">
<wsdl:port name="Service1Soap" binding="tns:Service1Soap">
<soap:address location="http://localhost:3075/Service1.asmx" />
</wsdl:port>
<wsdl:port name="Service1Soap12" binding="tns:Service1Soap12">
<soap12:address location="http://localhost:3075/Service1.asmx" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
hongqi162 2008-09-24
  • 打赏
  • 举报
回复
//c#编写webservice 
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;

namespace WebService1
{
/// <summary>
/// Service1 的摘要说明。
/// </summary>
public class Service1 : System.Web.Services.WebService
{
public Service1()
{
//CODEGEN: 该调用是 ASP.NET Web 服务设计器所必需的
InitializeComponent();
}

#region 组件设计器生成的代码

//Web 服务设计器所必需的
private IContainer components = null;

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if(disposing && components != null)
{
components.Dispose();
}
base.Dispose(disposing);
}

#endregion

// WEB 服务示例
// HelloWorld() 示例服务返回字符串 Hello World
// 若要生成,请取消注释下列行,然后保存并生成项目
// 若要测试此 Web 服务,请按 F5 键

[WebMethod]
public string HelloWorld()
{
return "Hello World ";
}
}
}


//import   wsdl部分 
unit Service1;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type
Service1Soap = interface(IInvokable)
[ '{CFE467D4-A39E-2BD2-5836-7685A9E27F8D} ']
function HelloWorld: WideString; stdcall;
end;

function GetService1Soap(UseWSDL: Boolean=System.False; Addr: string= ' '; HTTPRIO: THTTPRIO = nil): Service1Soap;


implementation

function GetService1Soap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): Service1Soap;
const
defWSDL = 'http://localhost/WebService1/Service1.asmx?wsdl ';
defURL = 'http://localhost/WebService1/Service1.asmx ';
defSvc = 'Service1 ';
defPrt = 'Service1Soap ';
var
RIO: THTTPRIO;
begin
Result := nil;
if (Addr = ' ') then
begin
if UseWSDL then
Addr := defWSDL
else
Addr := defURL;
end;
if HTTPRIO = nil then
RIO := THTTPRIO.Create(nil)
else
RIO := HTTPRIO;
try
Result := (RIO as Service1Soap);
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
end else
RIO.URL := Addr;
finally
if (Result = nil) and (HTTPRIO = nil) then
RIO.Free;
end;
end;


initialization
InvRegistry.RegisterInterface(TypeInfo(Service1Soap), 'http://tempuri.org/ ', 'utf-8 ');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(Service1Soap), 'http://tempuri.org/HelloWorld ');
InvRegistry.RegisterInvokeOptions(TypeInfo(Service1Soap), ioDocument);

end.


//调用部分 


var
ss:Service1Soap;
RIO : THTTPRIO;
begin
RIO:= THTTPRIO.Create( Owner );
ss:=RIO as Service1Soap;
RIO.WSDLLocation:= 'http://localhost/WebService1/Service1.asmx?wsdl ';
showmessage( ss.HelloWorld );
end;

//结果
Hello World
lovelymelon 2008-09-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hongqi162 的回复:]
file->new->other..->webservices->WSDL Importer(导入wsdl)

输入你的http://10.148.223.203/PIIS.asmx?wsdl
[/Quote]
这种情况下如果连接不上就无法继续进行了,能够给一个可用的,让我试一下,谢谢
lovelymelon 2008-09-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hongqi162 的回复:]
Delphi(Pascal) code
你也可以将他的wsdl保存成xml然后WSDL Importer导入这个xml,delphi调用webservice很简单的


使用方式就类似这样了

var
FXXX:XXX;
RIO : THTTPRIO;
rstxml:string;
yourxml:string;
begin
yourxml:='.......';
RIO:= THTTPRIO.Create( Owner );
FXXX:=RIO as XXX;
RIO.WSDLLocation:= http://10.148.223.203/PIIS.asmx?wsdl';
rstxml:=FXXX.GetValue_xml( yourxml );

[/Quote]
请教,XXX是什么意思?
shuihan20e 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hongqi162 的回复:]
file->new->other..->webservices->WSDL Importer(导入wsdl)

输入你的http://10.148.223.203/PIIS.asmx?wsdl
[/Quote]
支持月兄
fangsp 2008-09-23
  • 打赏
  • 举报
回复
帮顶一个
hongqi162 2008-09-23
  • 打赏
  • 举报
回复

操作xml你把这个类修改一下


unit XmlParser;

interface

uses
Classes, Records, XMLDoc, XMLIntf;
type
TXmlParser =class( TObject )
private
Xml: TXMLDocument;
strStream:TStringStream;
public
constructor Create( AOwner:TComponent; XmlStr: wideString );
destructor Destroy;override;
procedure GetVehInfo( XmlStr:wideString; var p: PVehInfo );
end;
implementation

{ TXmlParser }

constructor TXmlParser.Create( AOwner: TComponent; XmlStr: wideString );
begin
Xml:= TXMLDocument.Create( AOwner );
strStream:= TStringStream.Create( XmlStr );
Xml.LoadFromStream( strStream, xetUTF_8 );
Xml.Active:= True;
end;

destructor TXmlParser.Destroy;
begin
Xml.Free;
strStream.Free;
inherited;
end;

procedure TXmlParser.GetVehInfo(XmlStr: wideString; var p: PVehInfo);
var
TempXNode,TempXNode1,Node: IXmlNode;
IntI:Integer;
h:Head;
begin
try
TempXNode := Xml.DocumentElement;
Node:= TempXNode.ChildNodes.FindNode( 'head' );
h.code := Node.ChildNodes.FindNode( 'xh' ).NodeValue;
h.message := Node.ChildNodes.FindNode( 'message' ).NodeValue;
Node:= TempXNode.ChildNodes.FindNode( 'body' );
if Node <> nil then
begin
p^.xh := Node.ChildNodes.FindNode( 'xh' ).NodeValue;
p^.hpzl := Node.ChildNodes.FindNode( 'hpzl' ).NodeValue;
p^.hphm := Node.ChildNodes.FindNode( 'hphm' ).NodeValue;
p^.clpp1:= Node.ChildNodes.FindNode( 'clpp1' ).NodeValue;
p^.cllx := Node.ChildNodes.FindNode( 'cllx' ).NodeValue;
end;
finally
strStream.Free;
end;
end;

end.
hongqi162 2008-09-23
  • 打赏
  • 举报
回复

你也可以将他的wsdl保存成xml然后WSDL Importer导入这个xml,delphi调用webservice很简单的


使用方式就类似这样了

var
FXXX:XXX;
RIO : THTTPRIO;
rstxml:string;
yourxml:string;
begin
yourxml:='.......';
RIO:= THTTPRIO.Create( Owner );
FXXX:=RIO as XXX;
RIO.WSDLLocation:= http://10.148.223.203/PIIS.asmx?wsdl';
rstxml:=FXXX.GetValue_xml( yourxml );
end;
hongqi162 2008-09-23
  • 打赏
  • 举报
回复
file->new->other..->webservices->WSDL Importer(导入wsdl)

输入你的http://10.148.223.203/PIIS.asmx?wsdl
gwhdaxia 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lyguo 的回复:]
建议你看一下李维的一本关于电子商务方面的书,有讲SOAP的
[/Quote]

你说的是 <Delphi 5.x 分布式多层应用电子商务篇> 吗
lovelymelon 2008-09-23
  • 打赏
  • 举报
回复
书名是什么啊?
helodd 2008-09-23
  • 打赏
  • 举报
回复
TXMLDocument 来解释.或用其它第三方控件计来处理就行了, 这个比较简单
mdejtod 2008-09-22
  • 打赏
  • 举报
回复
var XMLConfigFile: TXMLDocument;
begin
XMLConfigFile := TXMLDocument.Create(AOwner);
try
XMLConfigFile.LoadFromFile(XMLFile);
XMLConfigFile.Active := true;
//读取节点内容,
finally
XMLConfigFile.Free;
end;
end;

lyguo 2008-09-22
  • 打赏
  • 举报
回复
建议你看一下李维的一本关于电子商务方面的书,有讲SOAP的
lovelymelon 2008-09-22
  • 打赏
  • 举报
回复
请问怎么连接XML文档呢?对方给我的说明文档里还有这么一句:

WebService url: http://10.148.223.203/PIIS.asmx

帮帮忙,谢谢,同志们
lovelymelon 2008-09-22
  • 打赏
  • 举报
回复
首先怎么连接XML文档呢?给我的说明文档里还有这么一句

WebService url: http://10.148.223.203/PIIS.asmx

yf520gn 2008-09-19
  • 打赏
  • 举报
回复
这个问题回答起来很复杂,但是不难!
你可以在谷歌里面搜‘万一的博客’,里面有关于DELPHI如何读取XML文件的详细论述
gwhdaxia 2008-09-19
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var
resultStr:string;
XmlNode :IXMLNode;
n,s:OleVariant ;
begin

//组合xml

XMLDocument1.XML.Add('<?xml version="1.0" encoding="gb2312"?> ') ;
XMLDocument1.XML.Add('<ts>') ;
XMLDocument1.XML.Add('<t n="13000272_158" d="2005-5-5 0:0:0" /> ') ;
XMLDocument1.XML.Add('<t n=" 13000272_158" />') ;
XMLDocument1.XML.Add('<t n="13000272_158" b="2005-5-5" e="2005-5-6" i="300" />') ;
XMLDocument1.XML.Add('</ts> ') ;

//
resultStr := GetValue_xml(XMLDocument1.XML.Text) ;

//XMLDocument2 去获取返回的XML
XMLDocument2.XML.Add(resultStr) ;

//循环读取节点
XmlNode := XMLDocument1.DocumentElement.ChildNodes.First ;
while XmlNode <> nil do
begin
if XmlNode.NodeName = 't' then
begin
n:= XmlNode.Attributes['n'] ;
s:= XmlNode.Attributes['s'] ;

end
else if XmlNode.NodeName = 'v' then
begin
n:= XmlNode.Attributes['n'] ;
s:= XmlNode.Attributes['s'] ;

end;


XmlNode := XmlNode.NextSibling ;
end;

end;
加载更多回复(2)

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧