알라딘데이터추출시 버퍼꼬이는 증상 수정

This commit is contained in:
2025-09-02 23:08:49 +09:00
parent 0cc71611d0
commit 8f74fb5557
8 changed files with 133 additions and 86 deletions

View File

@@ -10,6 +10,7 @@ using System.Threading.Tasks;
using System.Web.Script.Serialization;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;
namespace ISBN_Check_test
{
@@ -22,7 +23,7 @@ namespace ISBN_Check_test
/// <param name="QueryType"></param>
/// <param name="Param"></param>
/// <returns></returns>
public string Aladin(string Query, string QueryType, string[] Param)
public string[] Aladin(string Query, string QueryType, string[] Param)
{
string result = string.Empty;
// 쿼리 생성
@@ -49,57 +50,40 @@ namespace ISBN_Check_test
// xml형식을 json형식으로 변환
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
var json = JsonConvert.SerializeXmlNode(doc);
// json형식 분석을 위해 JavaScriptSerializer 개체 생성
JavaScriptSerializer js = new JavaScriptSerializer();
var xdoc = XDocument.Parse(xml);
var xroot = xdoc.Root;
// 런타임에 개체를 확인하여 사용할수 있는 dynamic을 이용해 역직렬화
dynamic dob = js.Deserialize<dynamic>(json);
// XML에서 직접 totalResults와 item 추출 (XDocument 사용)
XNamespace ns = "http://www.aladin.co.kr/ttb/apiguide.aspx";
// "object"내에 있는것을 얻어오기 위해 다시 dynamic변수에 참조
dynamic docs = "";
try
// totalResults 추출
string totalResults = xdoc.Descendants(ns + "totalResults").FirstOrDefault()?.Value ?? "0";
// item들 추출
var itemElements = xdoc.Descendants(ns + "item");
if (!itemElements.Any())
{
docs = dob["object"]["item"];
return new string[] { };
}
catch
{
return "";
}
int length = 0;
int length = itemElements.Count();
int ID_length = Param.Length;
// 검색 결과가 1개 이하일 경우, 오류가 발생하여 try/catch문 사용.
try
// XML item들을 순회하면서 필요한 데이터 추출 (XDocument 사용)
List<string[]> retval = new List<string[]>();
foreach (var itemElement in itemElements)
{
// docs는 요소 컬렉션으로 object로 변환.
object[] buf = docs;
length = buf.Length;
}
catch
{
object buf = docs;
length = 1;
}
for (int a = 0; a < length; a++)
{
List<string> tmp_data = new List<string>();
string[] buffer = new string[ID_length];
for (int b = 0; b < ID_length; b++)
{
if (length == 1)
{
tmp_data.Add(docs[Param[b]]);
}
else
{
tmp_data.Add(docs[a][Param[b]]);
}
result += tmp_data[b] + "|";
buffer[b] = itemElement.Element(ns + Param[b])?.Value ?? "";
}
result += "\n";
//retval.Add(buffer);
return buffer;
}
return result;
return new string[] { };
}
/// <summary>
/// https://blog.aladin.co.kr/openapi 참고
@@ -194,7 +178,7 @@ namespace ISBN_Check_test
// url 생성
string url = "https://openapi.naver.com/v1/search/book_adv?";
for(int a = 0; a < Query.Length; a++)
for (int a = 0; a < Query.Length; a++)
{
url += string.Format("{0}={1}&", QueryType[a], Query[a]);
}
@@ -278,7 +262,7 @@ namespace ISBN_Check_test
StreamReader reader = new StreamReader(stream, Encoding.UTF8);
string json = reader.ReadToEnd();
stream.Close();
JavaScriptSerializer js = new JavaScriptSerializer();
dynamic dob = js.Deserialize<dynamic>(json);
dynamic docs = dob["documents"];
@@ -287,18 +271,20 @@ namespace ISBN_Check_test
int length = buf.Length;
int ID_length = Param.Length;
for(int a = 0; a < length; a++)
for (int a = 0; a < length; a++)
{
List<object> tmp_data = new List<object>();
for(int b = 0; b < ID_length; b++)
for (int b = 0; b < ID_length; b++)
{
if (Param[b] == "authors") {
if (Param[b] == "authors")
{
object[] tmp = docs[a][Param[b]];
string tmp_str = string.Empty;
for(int j = 0; j < tmp.Length; j++)
for (int j = 0; j < tmp.Length; j++)
{
tmp_str += tmp[j];
if (j < tmp.Length - 1) {
if (j < tmp.Length - 1)
{
tmp_str += ", ";
}
}
@@ -306,7 +292,8 @@ namespace ISBN_Check_test
result += tmp_data[b] + "|";
tmp_str = "";
}
else {
else
{
tmp_data.Add(docs[a][Param[b]]);
result += tmp_data[b] + "|";
}