2013-11-27 5 views
1

У меня проблемы с пространствами имен. Мне нужно разобраться с публичным api (Prestashop). Это апи имеет XML как XLink типа, как показано ниже:JAXB + JERSEY. Как размонтировать несколько пространств имен

<prestashop xmlns:xlink="http://www.w3.org/1999/xlink"> 
<products> 
<product id="1" xlink:href="http://localhost:8080/prestashop/api/products/1"/> 
<product id="2" xlink:href="http://localhost:8080/prestashop/api/products/2"/> 
</products> 
</prestashop> 

API-интерфейс для каждого продукта:

<prestashop xmlns:xlink="http://www.w3.org/1999/xlink"> 
<product> 
<id> 
<![CDATA[ 1 ]]> 
</id> 
<id_manufacturer xlink:href="http://localhost:8080/prestashop/api/manufacturers/1"> 
<![CDATA[ 1 ]]> 
</id_manufacturer> 
<id_supplier xlink:href="http://localhost:8080/prestashop/api/suppliers/1"> 
<![CDATA[ 1 ]]> 
</id_supplier> 
<id_category_default xlink:href="http://localhost:8080/prestashop/api/categories/3"> 
<![CDATA[ 3 ]]> 
</id_category_default> 
</product> 
</prestashop> 

Я создал два пакета, который содержит классы Pojo для каждого XML. Я хотел бы получить свойства любого продукта с указанием идентификатора из списка продуктов.

У меня есть продукт с пространством имен в @XMLSchema, но это пространство имен статично только для одного пути. Я знал, что это не способ сделать это.

Ниже, мой клиентский класс.

public class ClientPrestashop{ 

    public static final Logger log = Logger.getLogger(ClientPrestashop.class.getCanonicalName()); 
    private final String pass = "LA4DKY4AVJUODHCX0H0XH8E7EROV05J6"; 
    private final String url="http://[email protected]:8080/prestashop/api/"; 

    public Object getPrestashopPackageProducts(String path, Class<?> clase) throws JAXBException, Exception{ 

     ClientConfig config= new DefaultClientConfig(); 
     Client client = Client.create(config); 
     client.addFilter(new HTTPBasicAuthFilter(pass, "")); 

     WebResource webresource = client.resource(url + path); 
     ClientResponse response = webresource.type(MediaType.APPLICATION_XML).get(ClientResponse.class); 

     mostrar(response.getStatus()); 

     JAXBContext jaxbContext = JAXBContext.newInstance(clase); 

     //Crear XMLFilter 
     XMLFilter filter = new NamespaceFilter(url+path,true); 

     //El XMLReader será encapsulado en nuestro XMLFilter. 
     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     spf.setNamespaceAware(true); 
     SAXParser sp = spf.newSAXParser(); 
     XMLReader xr = sp.getXMLReader(); 
     filter.setParent(xr); 

     //Modificar UnmarshalerHandler como ContentHandler en XMLFilter 
     Unmarshaller unmarshall = jaxbContext.createUnmarshaller(); 
     UnmarshallerHandler unmarshallerHandler = unmarshall.getUnmarshallerHandler(); 
     filter.setContentHandler(unmarshallerHandler); 

     //Parse del XML 
     InputSource sr = new InputSource(response.getEntityInputStream()); 
     filter.parse(sr); 
     Object presta = unmarshallerHandler.getResult(); 

     return presta; 
    } 

Здесь у вас есть код: https://github.com/JorgeP86/webservice.git

Можете ли вы помочь мне, пожалуйста?

+0

Я думаю, что вы можете быть в состоянии регулировки ожидаемой схемы URL в созданном пакете -info.java. Там должна быть аннотация. Если нет, вы можете использовать Castor, который немного менее строг при квалифицированных ограничениях имени. –

+0

Спасибо, Jamel Toms. Мой пакет-информация не генерировалась автоматически из данной xml-схемы. Я должен создать новый пакет, а затем заполнить следующий код '@XmlSchema (namespace =" http: // LA4DKY4AVJUODHCX0H0XH8E7EROV05J6 @ localhost: 8080/prestashop/api/products/1 ")' elementFormDefault = XmlNsForm.QUALIFIED ,. Затем я создал классы POJO с JAXB. – Jorge

+0

Но это пространство имен предназначено только для одного продукта, если я хочу .../products/2 Мне нужно его изменить. Как получить все пространства имен? – Jorge

ответ

0

Вы можете сделать следующее:

@XmlAccessorType(XmlAccessType.FIELD) 
public class Product { 

    @XmlAttribute 
    private int id; 

    @XmlAttribute(namespace="http://www.w3.org/1999/xlink") 
    private String href; 
} 

Для получения более подробной информации

Смежные вопросы