当前位置: 首页 > 知识库问答 >
问题:

如何使用camel jaxb设置编组xml的命名空间?

黄涵畅
2023-03-14

首先,我使用Camel 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">

我之所以需要一个名称空间前缀,是因为我计划使用xpath拆分xml中的值(例如Ecode),我需要一个名称空间前缀来实现这一点(这就是我研究的,我可能错了)。

我计划的路线代码是

.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:在注册表中找不到类型为java.util.Map的myprefix的bean)

实际上,我对apache camel路由世界还很陌生,所以我可能缺少一些基本的东西。

共有1个答案

林子石
2023-03-14

您根本不需要更改您的XML。没关系。

使用您发布的XML和您发布的命名空间声明,以下XPath可以很好地将XML(作为示例)拆分为两部分:

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 
 类似资料:
  • 我正在使用 JAXB 来对我正在实现 Java 客户端的 Web 服务进行封送和解组和取消马歇尔请求和响应。然而,我被困在以下回应上,我需要解体。 为了将响应表示为Java对象,我有以下域类: 然后,我执行以下操作来解除元帅: 解编组没有发生任何事件。 对象是使用两个列表创建的。为空,有一项。但是,该项目上的和 null。我认为这与XML命名空间有关,但我无法弄清楚如何修复它。 我尝试了另一种方式

  • 在JAXB将xml文件解组以请求对象并将其发送给servis时,我遇到了一些问题。 它返回错误而不是正确的响应-。 我正在使用下一个模式: 带有测试日期的xml文件= 以下是源xml文件: 我使用JAXB解析并转换到我的RQ对象。 它返回奇怪的错误而不是响应。 我只是将未解析的请求写入xml文件: 它有很多讨厌的ns1:nameprefix。 我想知道如何在没有冗余前缀的情况下解组?

  • 我的代码如下: 我怎样才能让它工作?如果我的xml标记有一些相关元素,如上面的“xmlns”,则JAXB解组器会抛出异常。 这是我第一次这么做,所以我对JAXB、解编等都一无所知。我在苦苦挣扎任何帮助都是好的。 编辑StackTrace:

  • 这是我的xml,需要把它转换成Java。我使用了jaxb 并抛出以下异常javax.xml.bind.unmarshalException:意外元素(URI:“http://www.ae.com/event/load”,local:“order”)。需要的元素为<{}LM:order>

  • 问题内容: 我有一个XML文档,内容如下: 我的问题是如何使用Python中的BeautifulSoup这样的库访问它们? xmlDom.web [“ Web”]。总计?不起作用? 问题答案: BeautifulSoup本身不是DOM库(它不实现DOM API)。使事情变得更复杂的是,您在该xml片段中使用了名称空间。要解析该特定的XML片段,可以使用BeautifulSoup,如下所示: 如果您

  • 我有一个XML要与JAXB解组。如果我从元素中删除所有名称空间属性,代码运行良好,但是如果我保留名称空间属性的话,在解组后会得到一个空对象。 XML是这样的: 我的动物豆是这样的: 猫豆就像: 在运行时,我得到一个空对象。我试图从属性中删除< code>"z:",得到了这个异常: 如果我从猫和动物中删除命名空间,我会得到这个例外: 下面是解组的最终代码。最后一行给出了一个空指针异常 我不确定如何处