📄 sgxawsparser.cpp
字号:
/**
*** Class Name : SGXAWSParser
*** Version : 1.0.0
***
*** Author : Sophia Cradle Incorporated
*** Platform : x86, ARM
*** OS : BREW 2.1, BREW 3.1
*** Target SophiaFramework Version : 3.0.6
*** Compiler : Visual C++ 6.0, Visual C++ .NET 2003,
*** RVCTB 1.2
**/
#include "SGXAWSParser.hpp"
// 偙偙偵Amazon 偺ID 傪愝掕偟偰偔偩偝偄
#define AMAZON_ID ""
#define AMAZON_URL_PREFIX "http://webservices.amazon.co.jp/onca/xml" \
"?Service=AWSECommerceService&Operation=ItemSearch" \
"&SubscriptionId=" AMAZON_ID "&SearchIndex=Books" \
"&ResponseGroup=Large" \
"&Power=isbn:"
#define AMAZON_URL_POSTFIX ""
SGXAWSParser::SGXAWSParser(Void) : _isParseItemAttributes(true),
_isParseImageUrl(false), _isParseOfferSummary(false),
_isParseOffers(false), _isParseCustomerReviews(false),
_isParseSimilarProducts(false), _isParseBrowserNodes(false),
_isParseListmaniaLists(false),
_itemAttributes(null), _imageUrl(null), _offerSummary(null), _offers(null),
_customerReviews(null), _similarProducts(null), _browserNodes(null),
_listmaniaLists(null)
{
return;
}
SGXAWSParser::~SGXAWSParser(Void)
{
Clear();
return;
}
SFXAnsiString SGXAWSParser::GetUrl(SFXAnsiStringConstRef isbn)
{
return AMAZON_URL_PREFIX + isbn + AMAZON_URL_POSTFIX;
}
Void SGXAWSParser::Clear(Void)
{
_title.Clear();
_asin.Clear();
delete _itemAttributes;
_itemAttributes = null;
delete _imageUrl;
_imageUrl = null;
delete _offerSummary;
_offerSummary = null;
if (_offers != null) {
SFXArray<OfferRecPtr>::Enumerator enumerator = _offers->offers.GetEnumerator();
while (enumerator.HasNext()) {
OfferRecPtr offer(enumerator.GetNext());
delete offer;
}
_offers->offers.Clear();
delete _offers;
_offers = null;
}
if (_customerReviews != null) {
SFXArray<ReviewRecPtr>::Enumerator enumerator = _customerReviews->reviews.GetEnumerator();
while (enumerator.HasNext()) {
ReviewRecPtr review(enumerator.GetNext());
delete review;
}
_customerReviews->reviews.Clear();
delete _customerReviews;
_customerReviews = null;
}
if (_similarProducts != null) {
SFXArray<SimilarProductRecPtr>::Enumerator enumerator = _similarProducts->similarProducts.GetEnumerator();
while (enumerator.HasNext()) {
SimilarProductRecPtr similarProduct(enumerator.GetNext());
delete similarProduct;
}
_similarProducts->similarProducts.Clear();
delete _similarProducts;
_similarProducts = null;
}
}
SFXAnsiString DecodeHtml(SFXAnsiStringConstRef string)
{
return string.Replace("<", '<').Replace(">", '>').Replace(""", '"').Replace("&", '&');
}
// filename 僼傽僀儖撪偺XML 傪夝愅偡傞
// 栠傝抣丗 SFERR_NO_ERROR 惉岟丄SFERR_FAILED 幐攕丄偦偺懠 XML 僷乕僒偺僄儔乕傪偦偺傑傑曉偡
SFCError SGXAWSParser::Parse(SFXAnsiStringConstRef filename)
{
SFCError error;
SFXXMLDOMParser parser;
parser.SetDoNamespaces(false);
Clear();
SFXHelper::dbgprintf("[SGXAWSParser] [%s]", filename.GetCString());
error = parser.Parse(filename); // XML 傪夝愅
SFXHelper::dbgprintf("[SGXAWSParser.Parse] [%d]", error);
if (error == SFERR_NO_ERROR) { // 夝愅惉岟
SFXXMLDocument* root = parser.GetDocument(); // 儖乕僩傪庢摼
if (root != null) {
SFXXMLNodePtr child;
// Item 僞僌傪扵偡
SFXList<SFXXMLNodePtr>* list = root->GetElementsByTagName("Item");
if (list != null && list->GetSize() > 0) {
child = list->Get(0); // 崱夞偺応崌丄Item 僞僌偼 1 偮偟偐側偄偼偢
for (child = child->GetFirstChild(); child != null && error == SFERR_NO_ERROR; child = child->GetNextSibling()) {
if (SFXAnsiString(child->GetNodeName()) == "ASIN") {
_asin = DecodeHtml(child->GetText());
} else if (SFXAnsiString(child->GetNodeName()) == "DetailPageURL") {
_detailPageURL = DecodeHtml(child->GetText());
} else if (SFXAnsiString(child->GetNodeName()) == "SalesRank") {
// SalesRank偵偼僇儞儅偑偮偄偰傞偺偱嶍彍
_salesRank = child->GetText().Replace(',', "").ToSInt32();
} else if (SFXAnsiString(child->GetNodeName()) == "ItemAttributes") {
if (_isParseItemAttributes) { // ItemAttributes 僞僌偺壓傪夝愅偡傞偐偳偆偐
error = ParseItemAttributes(child->GetFirstChild());
} else {// ItemAttributes 僞僌偺壓傪夝愅偟側偄側傜僞僀僩儖偺傒夝愅
error = ParseTitle(child->GetFirstChild());
}
} else if (SFXAnsiString(child->GetNodeName()) == "SmallImage") {
if (_isParseImageUrl) {
error = ParseSmallImage(child->GetFirstChild());
}
} else if (SFXAnsiString(child->GetNodeName()) == "MediumImage") {
if (_isParseImageUrl) {
error = ParseMediumImage(child->GetFirstChild());
}
} else if (SFXAnsiString(child->GetNodeName()) == "LargeImage") {
if (_isParseImageUrl) {
error = ParseLargeImage(child->GetFirstChild());
}
} else if (SFXAnsiString(child->GetNodeName()) == "OfferSummary") {
if (_isParseOfferSummary) {
error = ParseOfferSummary(child->GetFirstChild());
}
} else if (SFXAnsiString(child->GetNodeName()) == "Offers") {
if (_isParseOffers) {
error = ParseOffers(child->GetFirstChild());
}
} else if (SFXAnsiString(child->GetNodeName()) == "CustomerReviews") {
if (_isParseCustomerReviews) {
error = ParseCustomerReviews(child->GetFirstChild());
}
} else if (SFXAnsiString(child->GetNodeName()) == "SimilarProducts") {
if (_isParseSimilarProducts) {
error = ParseSimilarProducts(child->GetFirstChild());
}
} else if (SFXAnsiString(child->GetNodeName()) == "BrowseNodes") {
if (_isParseBrowserNodes) {
error = ParseBrowserNodes(child->GetFirstChild());
}
} else if (SFXAnsiString(child->GetNodeName()) == "ListmaniaLists") {
if (_isParseListmaniaLists) {
error = ParseListmaniaLists(child->GetFirstChild());
}
}
}
}
else {
error = SFERR_FAILED;
}
}
else {
error = SFERR_FAILED;
}
}
SFXHelper::dbgprintf("[SGXAWSParser] ParseXML END %d", error);
if (error != SFERR_NO_ERROR) {
_title = "夝愅幐攕";
SFXHelper::dbgprintf("[SGXAWSParser] ParseXML ERROR %d", error);
SFXHelper::dbgprintf("[SGXAWSParser] [%s]", parser.GetErrorInfo());
}
SFXHelper::dbgprintf("[SGXAWSParser] ParseXML END %d", error);
return error;
}
// 僿儖僷乕娭悢
SFXDate StringToDate(SFXAnsiStringConstRef string)
{
SFXDate ret(0);
// YYYY/MM/DD 宍幃偲 YYYY/MM 宍幃偑巊傢傟偰偄傞傛偆偱偡丅
// YYYY/MM 宍幃偺帪偺僨乕僞偺埖偄曽偼枹寛掕丅
if (string.GetLength() >= 10) {
ret.SetDate(static_cast<SInt16>(string.Substring(0, 4).ToUInt32()),
static_cast<SInt16>(string.Substring(5, 7).ToUInt32()),
static_cast<SInt16>(string.Substring(8, 10).ToUInt32()));
}
else if (string.GetLength() >= 7) {
ret.SetDate(static_cast<SInt16>(string.Substring(0, 4).ToUInt32()),
static_cast<SInt16>(string.Substring(5, 7).ToUInt32()), 1);
}
return ret;
}
// ItemAttributes 僞僌偺壓傪夝愅
SFCError SGXAWSParser::ParseItemAttributes(SFXXMLNodePtr node)
{
SFCError error(SFERR_NO_ERROR);
if (node != null) {
_itemAttributes = new ItemAttributesRec;
if (_itemAttributes != null) {
_itemAttributes->numberOfPages = 0;
_itemAttributes->packageDimensionsLength = 0;
_itemAttributes->packageDimensionsWidth = 0;
for (; node != null && error == SFERR_NO_ERROR; node = node->GetNextSibling()) {
if (SFXAnsiString(node->GetNodeName()) == "Binding") {
_itemAttributes->binding = DecodeHtml(node->GetText());
} else if (SFXAnsiString(node->GetNodeName()) == "Creator") {
if (node->HasAttributes()) {
error = _itemAttributes->creator.Append(
DecodeHtml(node->GetAttributes()->Item(0)->GetText()),
DecodeHtml(node->GetText())
);
}
} else if (SFXAnsiString(node->GetNodeName()) == "ListPrice") {
SFXXMLNodePtr node2(node->GetFirstChild());
for (; node2 != null; node2 = node2->GetNextSibling()) {
if (SFXAnsiString(node2->GetNodeName()) == "Amount") {
_itemAttributes->amount = node2->GetText().ToSInt32();
} else if (SFXAnsiString(node2->GetNodeName()) == "CurrencyCode") {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -