Как создать пространство имен с помощью StaxEventItemWriter rootElementAttribs - PullRequest
0 голосов
/ 27 декабря 2018

Я использую Spring Batch StaxEventItemWriter и Jaxb2Marshaller для создания файла XML;последний файл включает в себя пространство имен следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<product-lists 
xmlns="http://www.demandware.com/xml/impex/productlist/2009-10-28">
<product-list list-id="14d3a4eb97570219f2bd26525e">
<owner customer-no="00002004">
<email>c@j9.com</email>
</owner>
<type>wish_list</type>
<public>false</public>
</product-list>
</product-lists>

При создании атрибута пространства имен с помощью StaxEventItemWriter я получаю следующую ошибку:

Caused by: javax.xml.stream.XMLStreamException: xmlns has been already bound to . Rebinding it to http://www.demandware.com/xml/impex/productlist/2009-10-28 is an error
    at com.sun.xml.internal.stream.writers.XMLStreamWriterImpl.writeDefaultNamespace(XMLStreamWriterImpl.java:786)
    at com.sun.xml.internal.stream.writers.XMLStreamWriterImpl.writeNamespace(XMLStreamWriterImpl.java:1003)
    at com.sun.xml.internal.stream.writers.XMLEventWriterImpl.add(XMLEventWriterImpl.java:127)

Код создателя элемента:

@Bean(destroyMethod = "")
public ItemWriter<ProductList> xmlWriter() 
   StaxEventItemWriter<ProductList> xmlFileWriter = new StaxEventItemWriter<>();
   HashMap<String, String> rootElementAttribs = new HashMap<String, String>();
   String exportFilePath = "./XXX_List_XXX_" + FeedBatchUtil.getCurrentTimeStamp().replace(":", "").replace(".", "_") + ".xml";
   /* Doen not Work*/
   rootElementAttribs.put("xmlns", "http://www.demandware.com/xml/impex/productlist/2009-10-28");
   /*Works*/
   //rootElementAttribs.put("xmlns:ns1", "http://www.demandware.com/xml/impex/productlist/2009-10-28");
   xmlFileWriter.setResource(new FileSystemResource(exportFilePath));
   xmlFileWriter.setRootTagName("product-lists");
   xmlFileWriter.setRootElementAttributes(rootElementAttribs);
   Jaxb2Marshaller empMarshaller = new Jaxb2Marshaller();
   empMarshaller.setClassesToBeBound(ProductList.class);
   xmlFileWriter.setShouldDeleteIfEmpty(true);
   xmlFileWriter.setMarshaller(empMarshaller);
   return xmlFileWriter;
}

1 Ответ

0 голосов
/ 02 января 2019

Я хочу, чтобы значение пространства имен было следующим: <product-lists xmlns="demandware.com/xml/impex/productlist/2009-10-28">

Вот пример:

StaxEventItemWriter<ProductList> staxEventItemWriter = new StaxEventItemWriter<>();
staxEventItemWriter.setResource(new FileSystemResource("test.xml"));
HashMap<String, String> rootElementAttribs = new HashMap<String, String>();
rootElementAttribs.put("xmlns", "demandware.com/xml/impex/productlist/2009-10-28");
staxEventItemWriter.setRootTagName("product-lists");
staxEventItemWriter.setRootElementAttributes(rootElementAttribs);
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setClassesToBeBound(ProductList.class);
staxEventItemWriter.setMarshaller(marshaller);
staxEventItemWriter.afterPropertiesSet();

staxEventItemWriter.open(new ExecutionContext());
staxEventItemWriter.write(Arrays.asList(new ProductList()));
staxEventItemWriter.close();

Класс ProductList определяется следующим образом:

@XmlRootElement
private static class ProductList {
    // TODO add your fields as required
}

В предыдущем примере создается файл test.xml с искомым пространством имен:

<?xml version='1.0' encoding='UTF-8'?>
<product-lists xmlns="demandware.com/xml/impex/productlist/2009-10-28">
    <productList/>
</product-lists>

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...