eBay APIエラー: The reference to entity "xx" must end with the ';' delimiter

- プログラミング -
2023.08.08
ebay イーベイ 手作業を自動化

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: &quot;; 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の中で以下のアンパサンド記号(左)をエスケープ(右)していなかったのがエラーの原因だった。

& → &amp;

まず「entity "xx" must end with the ';' delimiter」とエラー文言にある"xx"の直前に「&」記号があるはず

その「&」を「&amp;」に置換するだけ。

たとえば、商品タイトルと商品説明欄に「&」を以下のように含んでいたとすると、

BEFORE
<Title>テスト&テスト<Title>
<Description>これはテスト&テストです</Description>

AFTER
<Title>テスト&amp;テスト<Title>
<Description>これはテスト&amp;テストです</Description>

のようにすることで、エラーが解消されました。

このように&を変換する関数でも挟んでおけばOKでしょう。

Pythondef url_encode_ampersand(original_string):
    return original_string.replace('&', '&amp;')
Google Apps Scriptfunction urlEncodeAmpersand(originalString) {
  return originalString.replace(/&/g, '&amp;');
}

参考stack overflow:
The reference to entity "foo" must end with the ';' delimiter

↑TOP