컴퓨터/c#

C# XML POST 전송과 응답, 파싱 예제 등

k1asd1 2020. 12. 3. 14:45
728x90
반응형

얼마 전 어쩌다 한 번씩 사용하는 사이트의 검색 결과를 XML 파싱할 일이 있어 작업하였습니다. 회사 업무용으로 가끔 사용하는데 응용 및 개선한다면 두루 사용 가능할 듯합니다.

 

XML 파싱 방법을 찾다가 우연히 외국 사이트에서 찾은 라이브러리가 있었는데 인코딩 문제 해결부터 결과 나오기까지 간단히 해결하는 방법도 있었으나 이번에는 비주얼 스튜디오 자체적으로 지원되는 클래스를 사용하였습니다.

 

XML 파싱 방법은 여러 가지 있는데 저는 XmlReader를 사용했습니다. 추후 다른 방법으로 개선한다면 그때 글을 작성하겠습니다.

 


* XML POST 전송 및 응답 소스

string strxml = "전송 될 xml";
string url = "URL 주소";

//호출
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);

//byte로 변경
byte[] reqInFormOfBytes = System.Text.Encoding.ASCII.GetBytes(strxml);

//속성 설정
req.Method = "POST";
req.ContentType = "text/xml;charset=utf-8";
req.ContentLength = reqInFormOfBytes.Length;

//stream 호출 및 전송
System.IO.Stream reqStream = req.GetRequestStream();
reqStream.Write(reqInFormOfBytes, 0, reqInFormOfBytes.Length);
reqStream.Close();

//#01
//응답
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

//streamReader 호출 및 문자열 처리
StreamReader respStream = new StreamReader(resp.GetResponseStream(), System.Text.Encoding.Default);
//#01

//확인용
string receresp = respStream.ReadToEnd();

//xmlReader 호출
XmlReader reader = XmlReader.Create(new StringReader(receresp));
respStream.Close();
resp.Close();

 


 

클래스 호출하고 내용 변환하고 stream으로 전송하고 응답받고 등등 여러가지 행위를 하고 있습니다.

 

하지만 응답받은 xml 전문을 보니 인코딩 문제로 문자들이 한글이 아닌 다르게 출력됩니다. 

 

*인코딩 설정 전 가공된 xml 내용 중 일부 발췌

결과

 

이를 해결하고자 ContentType을 설정하는 부분에서 'charset=utf-8'으로 설정하고 StreamReader 호출 시 마지막 인자로 'true'를 추가하여 전달하면 지정된 인코딩으로 자동 처리된다고 하였으나 적용되지 않았습니다.

 

제가 원하는 한글로 나오게 하기 위해 소스를 아래와 같이 수정합니다.


* 소스 추가 변경

//변경 전
//#01
//응답
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

//streamReader 호출 및 문자열 처리
StreamReader respStream = new StreamReader(resp.GetResponseStream(), System.Text.Encoding.Default);
//#01
//변경 후
//#01
//응답 호출
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

//인코딩 설정
Encoding encoding;

if (resp.CharacterSet == "utf-8")
{
    encoding = Encoding.UTF8;
} else {
    encoding = Encoding.Default;
}

//streamReader 호출 및 문자열 처리
StreamReader respStream = new StreamReader(resp.GetResponseStream(), encoding, true);
//#01

* 인코딩 설정을 추가했습니다.


 

 

문자열 처리까지 끝낸 후 응답받은 XML 전문의 각 요소를 원하는 대로 가공해서 사용합니다.

 


* XML 전문 예제

-<map id="">

<AB>R1000</AB>
<CD>연습용 예제</CD>
<EF>N</EF>

<GH>XML 파싱 예제. *오늘은 2020년 12월 3일 입니다.</GH>
</map>

 

* 소스

//xml 노드 확인
while(reader.Read())
{
    //xml 전문 중 노드명 중 'AB'가 있을 경우 그 요소를 가져온다
    if (reader.NodeType == XmlNodeType.Element && reader.Name == "GH")
    {
        string test = reader.ReadElementString();
    }
}

while문으로 xml 전문의 각 노드들을 확인하여 원하는 요소를 가져오는 방법입니다. 간단하게 확인하기 위해 위와 같이 작성하였으니 자신이 원하는 걸로 가공하면 됩니다.

 

* xml 파싱 테스트

xml 파싱 테스트

 

 

※ 잘못된 부분이나 틀린 내용이 있다면 지적해주세요.

 

 

 

 

 

728x90
반응형