Я работаю с eBay LMS (Large Merchant Services) и продолжаю сталкиваться с ошибкой:
org.xml.sax.SAXException:
SimpleDeserializer встретил ребенка
элемент, который НЕ ожидается, в
что-то пыталось
десериализации.
После много проб и ошибок я обнаружил проблему. Оказывается, это работает:
<?xml version="1.0" encoding="UTF-8"?>
<BulkDataExchangeRequests xmlns="urn:ebay:apis:eBLBaseComponents">
<Header>
<Version>583</Version>
<SiteID>0</SiteID>
</Header>
<AddFixedPriceItemRequest xmlns="urn:ebay:apis:eBLBaseComponents">
пока это (то, что я отправляю) не делает:
<?xml version="1.0" encoding="UTF-8"?>
<BulkDataExchangeRequests xmlns="urn:ebay:apis:eBLBaseComponents">
<Header>
<Version>583</Version>
<SiteID>0</SiteID>
</Header>
<AddFixedPriceItemRequest>
Разница заключается в атрибуте пространства имен xml в AddFixedPriceItemRequest
. Весь мой XML в настоящее время маршалируется через JAXB, и я не уверен, как лучше добавить второй атрибут xmlns к другому элементу в моем файле.
Так вот в чем вопрос. Как добавить атрибут xmlns к другому элементу в JAXB?
ОБНОВЛЕНИЕ:
package ebay.apis.eblbasecomponents;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AddFixedPriceItemRequestType", propOrder = {
"item"
})
public class AddFixedPriceItemRequestType
extends AbstractRequestType
{
@XmlElement(name = "Item")
protected ItemType item;
public ItemType getItem() {
return item;
}
public void setItem(ItemType value) {
this.item = value;
}
}
Добавлено определение класса по запросу.
ОБНОВЛЕНИЕ 2: отредактировал вышеприведенный класс примерно так, без эффекта:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "urn:ebay:apis:eBLBaseComponents",
name = "AddFixedPriceItemRequestType", propOrder = {
"item"
})
public class AddFixedPriceItemRequestType
ОБНОВЛЕНИЕ 3: Здесь приведен фрагмент класса BulkDataExchangeRequestsType. Я попытался добавить namespace="urn:ebay:apis:eBLBaseComponents"
в @XmlElement для AddFixedPriceItemRequest, но ничего не получилось.
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "BulkDataExchangeRequestsType", propOrder = {
"header",
"addFixedPriceItemRequest"
})
public class BulkDataExchangeRequestsType {
@XmlElement(name = "Header")
protected MerchantDataRequestHeaderType header;
@XmlElement(name = "AddFixedPriceItemRequest")
protected List<AddFixedPriceItemRequestType> addFixedPriceItemRequest;
ОБНОВЛЕНИЕ 4: Вот отвратительный кусок кода, который обновляет xml после сортировки для меня. В настоящее время это работает, хотя я не особо горжусь этим.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.newDocument();
marshaller.marshal(request, doc);
NodeList nodes = doc.getChildNodes();
nodes = nodes.item(0).getChildNodes();
for(int i = 0; i < nodes.getLength(); i++){
Node node = nodes.item(i);
if (!node.getNodeName().equals("Header")){
((Element)node).setAttribute("xmlns", "urn:ebay:apis:eBLBaseComponents");
}
}
Спасибо всем за помощь.