如何使用camel-jaxb设置封送xml的名称空间?

如何使用camel-jaxb设置封送xml的名称空间?,jaxb,apache-camel,jbossfuse,Jaxb,Apache Camel,Jbossfuse,首先,我将使用Camel版本2.15(在Fuse 6.2.1中)创建一些路由 在我的过程中,我尝试从使用cxf xjc maven插件生成的pojo创建XML(cxf xjc从xsd的某处读取一些xsd,然后生成带有jaxb注释的pojo) POJO为临时项目和临时项目 @XmlAccessorType(XmlAccessType.FIELD) @XmlType( name = "", propOrder = {"ecode", "tempName"} ) @XmlRootElement( na

首先,我将使用Camel版本2.15(在Fuse 6.2.1中)创建一些路由

在我的过程中,我尝试从使用cxf xjc maven插件生成的pojo创建XML(cxf xjc从xsd的某处读取一些xsd,然后生成带有jaxb注释的pojo)

POJO为临时项目和临时项目

@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;
}
}
我打电话

.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>
我查看了jaxbDataFormat.setNamespacePrefixRef(“myprefix”),但发现了一个错误(org.apache.camel.NoSuchBeanException:在注册表中找不到类型为java.util.Map的myprefix的bean)


事实上,我在ApacheCamel路由领域还是个新手,所以我可能缺少一些基本的东西

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

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

您的xpath在没有.namespace(ns1)和默认xml的情况下工作。当运行没有名称空间的路由时,您有什么问题吗?@c0ld它不工作,在split()之后,我仍然可以在日志中看到整个xml。。。拆分[XPath:/TempProjects/TempProject/Ecode/text()]->停止不经意阅读=)关于jaxb的答案在这里找不到,但更好的方法是通过@burki来回答。您的XPath没有带默认xml的.namespace(ns1)。当运行没有名称空间的路由时,您有什么问题吗?@c0ld它不工作,在split()之后,我仍然可以在日志中看到整个xml。。。split[XPath:/TempProjects/TempProject/Ecode/text()]-->停止不经意阅读=)关于jaxb的答案在这里找不到,但更好的方法是@burki的答案