자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi XML 호출해서 사용하는 프로그램인데 윈도우플랫폼에서는 잘되는데 안드로이드 플랫폼에서 오류남
2017.11.17 14:35
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 바쁜 와중에도 답변을 주시는 분들께 감사 댓글 필수
-----------------------------------------------------------------------------------------------
미들웨어로 XML을 받아서 델파이 10.1 베를린 에서 구현
코드 입력후 검색버튼 클릭하면 코드명 표시해주는 프로그램 입니다.
코드: 105146
코드명: [삭제]드립서버300ML[어라운지]EA
1. 윈도우 플랫폼에서 프로그램 실행을 하고
코드: 105146 입력 => 검색버튼 클릭
"[삭제]드립서버300ML[어라운지]EA" 로 정상적으로 표시되는데
플랫폼을 안드로이드로 변경하고
스마트폰에서 프로그램실행해서 검색버튼을 클릭하면 <그림2>와 같이 오류가 나는데 여러방법을 사용해봐도
해결이 안되어서 문의드립니다.
<그림1> 플랫폼 윈도우에서 실행
<그림2> 플랫폼: 안드로이드에서 실행하고 검색버튼을 클릭하면 오류남
------- source ---------------
procedure TForm1.Button1Click(Sender: TObject);
var
L_IPGO_CNF, gLOGIN_CHEK,Maeil_URL : String;
XMLBodyNode, XMLDataNode, XMLListNode, XMLRowNode, XMLColumnNode: IXMLNode;
Node: IXMLNode;
PutData : TStringStream;
DResult : TStringStream;
Indy : TIdHTTP;
ii, iCnt : integer;
Key_Name, Key_Value : String;
L_RETN_VLUE : String;
XMLRqst : String; // 170921
IdCookieManager: TIdCookieManager; // 170921
begin
XMLRqst := '<root company="belvew"/>'; // 170921
Maeil_URL := 'http://url-ip/DelphiCommand';
if ED_ITM_CD.Text = '' then
begin
ED_ITM_NM.Text := '';
Exit;
end;
PutData := TStringStream.Create();
DResult := TStringStream.Create(XMLRqst, TEncoding.UTF8); // UTF8
Indy := TIdHttp.Create;
Indy.CookieManager := idCookieManager;
Indy.ReadTimeout := 60000;{ IdTimeoutInfinite; } // 170921
Indy.ConnectTimeout := 60000; // 170921
Indy.HandleRedirects := True; // 170921
Indy.Compressor := TIdCompressorZLib.Create(Indy); // 170921
Try
Memo1.Lines.text := 'SELECT NVL(ITM_CD,' + '''' + 'Z' + '''' + ')' + ' ITM_CD' +
' ,NVL(ITM_NM,' + '''' + 'Z' + ''''+ ')' + ' ITM_NM' +
' FROM A_ITM_TEST' +
' WHERE ITM_CD = ' + ''''+ ED_ITM_CD.Text + '''';
// 각 인자들을 &로 연결시켜줍니다.
Indy.Request.ContentType := 'application/x-www-form-urlencoded';
gLOGIN_CHEK := '&user_idid=' + '12352' + '&sabn_pswd=' + '11';
PutData.WriteString('command=DelphiQueryCommand' + gLOGIN_CHEK +'&query=' + HTTPEncode(Memo1.Text));
// POST시킵니다. 리턴된 결과 XML은 DResult에 저장됩니다.
Indy.Post(Maeil_URL,PutData,DResult);
XMLDoc.LoadFromStream(DResult); //===> 이부분에서 오류납니다.
XMLDoc.Active:=True;
XMLBodyNode:= XMLDoc.ChildNodes.FindNode('result');
XMLDataNode:= XMLBodyNode.ChildNodes.FindNode('status_detail');
XMLListNode:= XMLDataNode.ChildNodes.FindNode('list');
for ii := 0 to XMLBodyNode.ChildNodes.Count - 1 do
begin
Memo1.Lines.Add('i');
if XMLBodyNode.ChildNodes.Nodes[ii].NodeName = 'status' then
begin
if XMLBodyNode.ChildNodes.Nodes[ii].NodeValue = 'OK' then
begin
//처리로직
if XMLListNode.ChildNodes.Count > 0 then
begin
XMLRowNode:= XMLListNode.ChildNodes.FindNode('row');
repeat
begin
XMLColumnNode:= XMLRowNode.ChildNodes.FindNode('column');
repeat
Key_Name := '';
Key_Value := '';
Key_Name := XMLColumnNode.AttributeNodes.Get(0).NodeValue;
Key_Value := XMLColumnNode.ChildNodes[0].NodeValue;
if UpperCase(Key_Name) = 'ITM_CD' then
begin
if Key_Value = 'Z' then ED_ITM_CD.Text := ''
else ED_ITM_CD_1.Text := Key_Value;
end
else
if UpperCase(Key_Name) = 'ITM_NM' then
begin
if Key_Value = 'Z' then ED_ITM_NM.Text := ''
else ED_ITM_NM.Text := Key_Value;
end;
XMLColumnNode := XMLColumnNode.NextSibling;
until XMLColumnNode = nil;
end;
XMLRowNode := XMLRowNode.NextSibling;
until XMLRowNode = nil;
end
else
begin
end;
end
else
if XMLBodyNode.ChildNodes.Nodes[ii].NodeValue = 'LOGIN_FAIL' then // LOGIN_FAIL시 다시 로그인
begin
ShowMessage('서버와의 접속이 끊겼습니다. 다시 로그인 하세요');
end
else
if XMLBodyNode.ChildNodes.Nodes[ii].NodeValue = 'ERROR' then
begin
ShowMessage(XMLBodyNode.ChildNodes.Nodes[0].NodeValue);
end;
end;
end;
finally
// 메모리에서 해제
PutData.Free;
DResult.Free;
Indy.Free;
end;
end;
댓글 5
-
험프리
2017.11.20 11:18
-
SHWOO
2017.11.28 14:41
한글이 아닌 영숫자 결과값이 나올경우는 정상적으로 조회가 되는데 한글이 있는경우에 위와 같은 오류가 납니다.
안드로이드에서 한글변환이 안되는것 같은데 어떻게 처리를 해야 할까요?
DResult := TStringStream.Create(XMLRqst, TEncoding.UTF8); // UTF8
-
아크나톤
2017.11.28 19:17
델파이 잘 모르지만....
XMLDoc.LoadFromStream(DResult);
위의 문장을
XMLDoc.LoadFromStream(DResult, TEncoding.GetEncoding(949)); 로 한번 해보시죠.
-
SHWOO
2017.11.29 10:07
XMLDoc.LoadFromStream(DResult, TEncoding.GetEncoding(949)); 변경하고 실행하면 컴파일시 E2010 Incompatible types: "TXMLEncodingType' and 'TEncoding' 오류납니다.
-
silkroad99
2017.12.01 09:22
url 주소를 HTTPEncode 변환후에
아래와 같은 방식으로 처리하면 됩니다.
var
.....
.....
StrXml: string;
UserQuery, URL_Address : String;
begin
Maeil_URL := UTF8Encode('http://www.xxx.xxx.xx');
if ED_ITM_CD.Text = '' then
begin
ED_ITM_NM.Text := '';
Exit;
end;
Try
UserQuery := 'SELECT * FROM ........';
IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded;';
IdHTTP1.Request.ContentEncoding := 'utf-8';
gLOGIN_CHEK := '&user_idid=' + '12352' + '&sabn_pswd=' + '11';
URL_Address := '';
URL_Address := URL_Address + 'command=DelphiQueryCommand' + gLOGIN_CHEK +'&query=' + HTTPEncode(UserQuery);
Memo1.Lines.Add(Maeil_URL + URL_Address);
IdHTTP1.CookieManager := idCookieManager;
IdHTTP1.ReadTimeout := 0;
IdHTTP1.ConnectTimeout := 0;
IdHTTP1.HandleRedirects := True;
IdHTTP1.Compressor := TIdCompressorZLib.Create(IdHTTP1);
try
StrXml := IdHTTP1.Get(Maeil_URL + URL_Address);
except
on E: Exception do
begin
ShowMessage ('Error: ' + E.Message);
Exit;
end;
end;
XMLDoc.LoadFromXML(StrXml);
처리로직
........
........
........
........
........
........
end;
추천:1 댓글
Delphi XML 호출해서 사용하는 프로그램인데 윈도우플랫폼에서는 잘되는데 안드로이드 플랫폼에서 오류남
2017.11.17 14:35
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 바쁜 와중에도 답변을 주시는 분들께 감사 댓글 필수
-----------------------------------------------------------------------------------------------
미들웨어로 XML을 받아서 델파이 10.1 베를린 에서 구현
코드 입력후 검색버튼 클릭하면 코드명 표시해주는 프로그램 입니다.
코드: 105146
코드명: [삭제]드립서버300ML[어라운지]EA
1. 윈도우 플랫폼에서 프로그램 실행을 하고
코드: 105146 입력 => 검색버튼 클릭
"[삭제]드립서버300ML[어라운지]EA" 로 정상적으로 표시되는데
플랫폼을 안드로이드로 변경하고
스마트폰에서 프로그램실행해서 검색버튼을 클릭하면 <그림2>와 같이 오류가 나는데 여러방법을 사용해봐도
해결이 안되어서 문의드립니다.
<그림1> 플랫폼 윈도우에서 실행
<그림2> 플랫폼: 안드로이드에서 실행하고 검색버튼을 클릭하면 오류남
------- source ---------------
procedure TForm1.Button1Click(Sender: TObject);
var
L_IPGO_CNF, gLOGIN_CHEK,Maeil_URL : String;
XMLBodyNode, XMLDataNode, XMLListNode, XMLRowNode, XMLColumnNode: IXMLNode;
Node: IXMLNode;
PutData : TStringStream;
DResult : TStringStream;
Indy : TIdHTTP;
ii, iCnt : integer;
Key_Name, Key_Value : String;
L_RETN_VLUE : String;
XMLRqst : String; // 170921
IdCookieManager: TIdCookieManager; // 170921
begin
XMLRqst := '<root company="belvew"/>'; // 170921
Maeil_URL := 'http://url-ip/DelphiCommand';
if ED_ITM_CD.Text = '' then
begin
ED_ITM_NM.Text := '';
Exit;
end;
PutData := TStringStream.Create();
DResult := TStringStream.Create(XMLRqst, TEncoding.UTF8); // UTF8
Indy := TIdHttp.Create;
Indy.CookieManager := idCookieManager;
Indy.ReadTimeout := 60000;{ IdTimeoutInfinite; } // 170921
Indy.ConnectTimeout := 60000; // 170921
Indy.HandleRedirects := True; // 170921
Indy.Compressor := TIdCompressorZLib.Create(Indy); // 170921
Try
Memo1.Lines.text := 'SELECT NVL(ITM_CD,' + '''' + 'Z' + '''' + ')' + ' ITM_CD' +
' ,NVL(ITM_NM,' + '''' + 'Z' + ''''+ ')' + ' ITM_NM' +
' FROM A_ITM_TEST' +
' WHERE ITM_CD = ' + ''''+ ED_ITM_CD.Text + '''';
// 각 인자들을 &로 연결시켜줍니다.
Indy.Request.ContentType := 'application/x-www-form-urlencoded';
gLOGIN_CHEK := '&user_idid=' + '12352' + '&sabn_pswd=' + '11';
PutData.WriteString('command=DelphiQueryCommand' + gLOGIN_CHEK +'&query=' + HTTPEncode(Memo1.Text));
// POST시킵니다. 리턴된 결과 XML은 DResult에 저장됩니다.
Indy.Post(Maeil_URL,PutData,DResult);
XMLDoc.LoadFromStream(DResult); //===> 이부분에서 오류납니다.
XMLDoc.Active:=True;
XMLBodyNode:= XMLDoc.ChildNodes.FindNode('result');
XMLDataNode:= XMLBodyNode.ChildNodes.FindNode('status_detail');
XMLListNode:= XMLDataNode.ChildNodes.FindNode('list');
for ii := 0 to XMLBodyNode.ChildNodes.Count - 1 do
begin
Memo1.Lines.Add('i');
if XMLBodyNode.ChildNodes.Nodes[ii].NodeName = 'status' then
begin
if XMLBodyNode.ChildNodes.Nodes[ii].NodeValue = 'OK' then
begin
//처리로직
if XMLListNode.ChildNodes.Count > 0 then
begin
XMLRowNode:= XMLListNode.ChildNodes.FindNode('row');
repeat
begin
XMLColumnNode:= XMLRowNode.ChildNodes.FindNode('column');
repeat
Key_Name := '';
Key_Value := '';
Key_Name := XMLColumnNode.AttributeNodes.Get(0).NodeValue;
Key_Value := XMLColumnNode.ChildNodes[0].NodeValue;
if UpperCase(Key_Name) = 'ITM_CD' then
begin
if Key_Value = 'Z' then ED_ITM_CD.Text := ''
else ED_ITM_CD_1.Text := Key_Value;
end
else
if UpperCase(Key_Name) = 'ITM_NM' then
begin
if Key_Value = 'Z' then ED_ITM_NM.Text := ''
else ED_ITM_NM.Text := Key_Value;
end;
XMLColumnNode := XMLColumnNode.NextSibling;
until XMLColumnNode = nil;
end;
XMLRowNode := XMLRowNode.NextSibling;
until XMLRowNode = nil;
end
else
begin
end;
end
else
if XMLBodyNode.ChildNodes.Nodes[ii].NodeValue = 'LOGIN_FAIL' then // LOGIN_FAIL시 다시 로그인
begin
ShowMessage('서버와의 접속이 끊겼습니다. 다시 로그인 하세요');
end
else
if XMLBodyNode.ChildNodes.Nodes[ii].NodeValue = 'ERROR' then
begin
ShowMessage(XMLBodyNode.ChildNodes.Nodes[0].NodeValue);
end;
end;
end;
finally
// 메모리에서 해제
PutData.Free;
DResult.Free;
Indy.Free;
end;
end;
댓글 5
-
험프리
2017.11.20 11:18
-
SHWOO
2017.11.28 14:41
한글이 아닌 영숫자 결과값이 나올경우는 정상적으로 조회가 되는데 한글이 있는경우에 위와 같은 오류가 납니다.
안드로이드에서 한글변환이 안되는것 같은데 어떻게 처리를 해야 할까요?
DResult := TStringStream.Create(XMLRqst, TEncoding.UTF8); // UTF8
-
아크나톤
2017.11.28 19:17
델파이 잘 모르지만....
XMLDoc.LoadFromStream(DResult);
위의 문장을
XMLDoc.LoadFromStream(DResult, TEncoding.GetEncoding(949)); 로 한번 해보시죠.
-
SHWOO
2017.11.29 10:07
XMLDoc.LoadFromStream(DResult, TEncoding.GetEncoding(949)); 변경하고 실행하면 컴파일시 E2010 Incompatible types: "TXMLEncodingType' and 'TEncoding' 오류납니다.
-
silkroad99
2017.12.01 09:22
url 주소를 HTTPEncode 변환후에
아래와 같은 방식으로 처리하면 됩니다.
var
.....
.....
StrXml: string;
UserQuery, URL_Address : String;
begin
Maeil_URL := UTF8Encode('http://www.xxx.xxx.xx');
if ED_ITM_CD.Text = '' then
begin
ED_ITM_NM.Text := '';
Exit;
end;
Try
UserQuery := 'SELECT * FROM ........';
IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded;';
IdHTTP1.Request.ContentEncoding := 'utf-8';
gLOGIN_CHEK := '&user_idid=' + '12352' + '&sabn_pswd=' + '11';
URL_Address := '';
URL_Address := URL_Address + 'command=DelphiQueryCommand' + gLOGIN_CHEK +'&query=' + HTTPEncode(UserQuery);
Memo1.Lines.Add(Maeil_URL + URL_Address);
IdHTTP1.CookieManager := idCookieManager;
IdHTTP1.ReadTimeout := 0;
IdHTTP1.ConnectTimeout := 0;
IdHTTP1.HandleRedirects := True;
IdHTTP1.Compressor := TIdCompressorZLib.Create(IdHTTP1);
try
StrXml := IdHTTP1.Get(Maeil_URL + URL_Address);
except
on E: Exception do
begin
ShowMessage ('Error: ' + E.Message);
Exit;
end;
end;
XMLDoc.LoadFromXML(StrXml);
처리로직
........
........
........
........
........
........
end;
추천:1 댓글
위 코드만 봐서는 원인파악이 어렵습니다.(그림도 표시되지 않습니다.)
우선, 디버깅 과정을 통해 원인을 확인하시는게 좋습니다.
예를 들면,
1) DResult에 정확한 XML 포맷의 문자열이 수신됐는가?
2) XMLDoc, DResult 등 컴포넌트가 잘 생성되고 초기화 됐는가?
등등을 안드로이드 환경에서 디버그 모드로 확인해 보시기 바랍니다.
디버그 모드에서 오류 발생 시 오류의 내용을 IDE에서 조금 더 자세히 확인할 수 있습니다.
오류 내용에 따라 조치 및 추가 문의 주시기 바랍니다.