eBay APIエラー: The reference to entity "xx" must end with the ';' delimiter
eBay APIで出品しているとき、以下見慣れないエラーに遭遇。
<?xml version="1.0" encoding="UTF-8"?>
<AddFixedPriceItemResponse xmlns="urn:ebay:apis:eBLBaseComponents"><Timestamp>2023-08-06T11:17:19.515Z</Timestamp><Ack>Failure</Ack><Errors><ShortMessage>XML Parse error.</ShortMessage><LongMessage>XML Error Text: "; nested exception is:
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1507; The reference to entity "xxx" must end with the ';' delimiter.".</LongMessage><ErrorCode>5</ErrorCode><SeverityCode>Error</SeverityCode><ErrorParameters ParamID="0"><Value>; nested exception is:
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1507; The reference to entity "xxx" must end with the ';' delimiter.</Value></ErrorParameters><ErrorClassification>RequestError</ErrorClassification></Errors><Version>1319</Version><Build>E1319_UNI_API5_19110890_R1</Build></AddFixedPriceItemResponse>
結論から言うと、組み上げたXMLの中で以下のアンパサンド記号(左)をエスケープ(右)していなかったのがエラーの原因だった。
& → &
まず「entity "xx" must end with the ';' delimiter」とエラー文言にある"xx"の直前に「&」記号があるはず。
その「&」を「&」に置換するだけ。
たとえば、商品タイトルと商品説明欄に「&」を以下のように含んでいたとすると、
BEFORE
<Title>テスト&テスト<Title>
<Description>これはテスト&テストです</Description>
AFTER
<Title>テスト&テスト<Title>
<Description>これはテスト&テストです</Description>
のようにすることで、エラーが解消されました。
このように&を変換する関数でも挟んでおけばOKでしょう。
Pythondef url_encode_ampersand(original_string):
return original_string.replace('&', '&')
Google Apps Scriptfunction urlEncodeAmpersand(originalString) {
return originalString.replace(/&/g, '&');
}
参考stack overflow:
The reference to entity "foo" must end with the ';' delimiter