如何使用camel-jaxb设置封送xml的名称空间?
首先,我将使用Camel版本2.15(在Fuse 6.2.1中)创建一些路由 在我的过程中,我尝试从使用cxf xjc maven插件生成的pojo创建XML(cxf xjc从xsd的某处读取一些xsd,然后生成带有jaxb注释的pojo) POJO为临时项目和临时项目如何使用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
@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的答案