Как установить пространство имен маршаллированного xml с помощью camel jaxb? - PullRequest
0 голосов
/ 12 сентября 2018

Для начала я создаю несколько маршрутов, используя Camel ver 2.15 (в Fuse 6.2.1).

На моем пути я пытаюсь создать XML из pojo, сгенерированного с использованием плагина cxf-xjc maven (cxf-xjc где-то прочитал xsd, а затем из xsd были созданы pojos с аннотациями jaxb).

Pojos - это TempProject и TempProjects.

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
name = "",
propOrder = {"ecode", "tempName"}
)
@XmlRootElement(
name = "TempProject"
)
public class TempProject implements Serializable {
@XmlElement(
    name = "Ecode",
    required = true
)
protected String ecode;
@XmlElement(
    name = "TempName",
    required = true
)
protected String tempName;

public TempProject() {
}

public String getEcode() {
    return this.ecode;
}

public void setEcode(String value) {
    this.ecode = value;
}

public String getTempName() {
    return this.tempName;
}

public void setTempName(String value) {
    this.tempName = value;
}
}


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
name = "",
propOrder = {"tempProjects"}
)
@XmlRootElement(
name = "TempProjects"
)
public class TempProjects implements Serializable {
@XmlElement(
    name = "TempProject",
    required = true
)
protected List<TempProject> tempProjects;

public TempProjects() {
}

public List<TempProject> getTempProjects() {
    if (this.tempProjects == null) {
        this.tempProjects = new ArrayList();
    }

    return this.tempProjects;
}
}

Я могу сгенерировать xml, используя этот код:

 JAXBContext jaxbContext = JAXBContext.newInstance(new Class[]{TempProjects.class}); 
 jaxbContext.createMarshaller();
 JaxbDataFormat jaxbDataFormat = new JaxbDataFormat(jaxbContext); //import org.apache.camel.converter.jaxb.JaxbDataFormat;

Я звоню

.marshal(jaxbDataFormat)

на моем пути, чтобы выполнить сортировку из ПОЖО в XML.

Сгенерированный xml размещен ниже:

<TempProjects xmlns="http://blah.blah/foo/schema/v2">
<TempProject>
    <Ecode>1</Ecode>
    <TempName>Tempname1</TempName>
</TempProject>
<TempProject>
    <Ecode>2</Ecode>
    <TempName>Tempname2</TempName>
</TempProject>

Как мне создать маршаллированный xml, который будет иметь пространство имен, подобное этому ...

<TempProjects xmlns:myprefix="http://blah.blah/foo/schema/v2">

Причина, по которой мне понадобился префикс пространства имен, заключается в том, что я планирую разделить значения (например, Ecode) в xml с использованием xpath, и мне для этого нужен префикс пространства имен (это то, что я исследовал, я мог бы быть неправильно).

Мой запланированный код в моем маршруте

.marshal(jaxbDataFormat)
.split( xpath("/TempProjects/TempProject/Ecode/text()").namespaces(ns1), 
new ProjectIdsAggregator()) //the above xpath doesn't work because it doesn't have a namespace prefix

//Namespaces ns1 = new Namespaces("myprefix", "http://blah.blah/foo/schema/v2" );

Я посмотрел на jaxbDataFormat.setNamespacePrefixRef ("myprefix"), но я получил ошибку ( org.apache.camel.NoSuchBeanException: в реестре не найден компонент для: myprefix типа: java.util. Карта )

Я на самом деле довольно новичок в мире маршрутизации верблюдов Apache, так что я могу упустить некоторые базовые вещи.

1 Ответ

0 голосов
/ 12 сентября 2018

Вам вообще не нужно менять XML .Это нормально.

С отправленным вами XML и опубликованным объявлением пространства имен, следующий XPath отлично работает для разделения XML (в качестве примера) на две TempProject части:

xpath("/myprefix:TempProjects/myprefix:TempProject").namespaces(ns1)

Поскольку вы объявили пространство имен XML следующим образом:

Namespaces ns1 = new Namespaces("myprefix", "http://blah.blah/foo/schema/v2" )

Ваш XPath должен использовать префикс myprefix для всех элементов:

/myprefix:TempProjects/myprefix:TempProject 
...