Я работаю с СДО eBay в (Большой Merchant Services) и продолжал работать в ошибку:Как добавить атрибут пространства имен в элемент JAXB при сортировке?
org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.
После много проб и ошибок я проследил проблему вниз. Оказывается, это работает:
<?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?
UPDATE:
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;
UPDATE 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");
}
}
Спасибо за помощь всем.
Что именно вы подразумеваете под «сгенерированным через JAXB»? Не могли бы вы добавить определение вашего класса AddFixedPriceItemRequest –
Я использую маршаллинг через JAXB для генерации XML. Я не вижу конкретного тега, который добавляет атрибут xmlns в класс BulkDataExchangeRequestsType. Я добавил определение класса AddFixedPriceItemRequestType. –
Почему бы не создать схему, указанную в WSDL? http://developer.ebay.com/webservices/bulk-data-exchange/latest/BulkDataExchangeService.wsdl –