如何使用骆驼jaxb设置封送处理的xml的命名空间?

时间:2018-09-12 11:34:16

标签: jaxb apache-camel jbossfuse

对于初学者来说,我正在使用Camel ver 2.15(在Fuse 6.2.1中)创建一些路线。

在我的路线中,我试图从使用cxf-xjc maven插件生成的pojo创建XML(cxf-xjc从xsd读取某处的xsd,然后生成带有jaxb批注的pojo)。

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)

在实现从pojo到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">

原因是我需要一个namespaceprefix的原因,是因为我计划使用xpath 分割 xml中的值(例如Ecode),并且我需要一个namespaceprefix来做到这一点(这是我研究过的,是错的)。

我在路线中计划的代码是

.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 :(得分:2)

您根本不需要更改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