当前位置: 首页 > 面试题库 >

JAXB零散编组

焦信鸥
2023-03-14
问题内容

我在使用Marshaller.JAXB_FRAGMENT属性成功编组时遇到了一些麻烦。这是我尝试输出的XML的简单版本。

<Import>
    <WorkSets>
        <WorkSet>
            <Work>
            <Work>
            ...
            ..
            ...
        </WorkSet>
        <WorkSet>
            <Work>
            <Work>
            ...
        </WorkSet>
    <WorkSets>
<Import>

<Import><WorkSets>元件基本上围住了大量的只是容器元素<WorkSet><Work>元件。我目前正在尝试在马歇尔(Marshall)上编组<WorkSet>

  1. 是否有可能先将<Import>and <WorkSets>元素编组,然后再将其编组到<WorkSet>element 上,然后将输出包含在<Import><WorkSets>标记中?
  2. 当我在WorkSet级别进行封送处理时,它将xmlns='http://namespace.com'属性附加到WorkSet标记中,有没有一种方法可以在没有将名称空间属性附加到Workset的情况下进行封送?

问题答案:

基本上,您希望能够流传输WorkSet实例的集合以使用JAXB封送,而不是使用容器对象构造完整的对象树。

我将采用的方法是使用XMLStreamWriter并通过将WorkSet对象包装在JAXBElement中来封送它们。我没有立即测试示例代码,因此这是应该使您步入编写轨道的粗略代码段:

FileOutputStream fos = new FileOutputStream("foo.xml");
XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(fos);

writer.writeStartDocument();
writer.writeStartElement("Import");
writer.writeStartElement("WorkSets");

JAXBContext context = JAXBContext.newInstance(WorkSet.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 
for (WorkSet instance : instances)
{
    JAXBElement<WorkSet> element = new JAXBElement<WorkSet>(QName.valueOf("WorkSet"), WorkSet.class, instance);
    m.marshal(element, writer);
}

writer.writeEndDocument(); // this will close any open tags
writer.close();

注意:
上面的代码完全未经测试,可能在包装部分中有些混乱,无法写入WorkSet的每个实例。您需要包装WorkSet实例,因为它们不会被注释,@XmlRootElement否则JAXB将拒绝封送对象。



 类似资料:
  • 问题内容: 我正在尝试与JAXB进行封送处理。 我的输出就像 但是我需要像这样的输出 我正在使用以下代码来执行此操作。如果我取消注释代码,则会出现属性绑定异常。没有它,我可以编译,但无法获得所需的确切输出。 和我的豆lo 转接器类别 问题答案: 您可以执行以下操作: 适配器CDATA 根 该注释用于指定的应该被使用。 演示版 我必须包装一个以获得所需的效果。另请注意,设置方法意味着它负责该操作的所

  • 问题内容: 我正在构建一系列链接的类,我希望它们的实例能够编组到XML,以便可以将它们保存到文件中并在以后再次读取。 目前,我正在使用以下代码作为测试用例: XML输出为: 元素为空是否有原因?我希望它包含日期(即)的字符串表示形式。为此,我是否需要编写自己的代码? 输出为: 问题答案: 您将必须创建一个这样的: 并使用 另请参阅是否要在程序包级别定义适配器。

  • 问题内容: 我正在尝试使用JAXB的自省功能来编组和分解所有使用JAXB批注标记的现有域对象。大多数事情都按预期运行,但是要获得一个相当简单的类进行序列化,我会遇到很多麻烦。此类在许多bean上用作@XmlElement,看起来像: 我尝试执行以下操作,但没有成功,JAXB仍然对接口Comparable感到愤怒。 将Range和DoubleRange都用作bean getter的返回类型会产生如下

  • 对象使用JAXBContext创建的封送器进行封送。生成的xml将变成: 类Hi是从不能更改的xsd生成的。我的问题是,如果“hello”为null,有没有一种方法可以让封送器忽略nillable参数,并且不向xml输出任何内容?

  • 我想将一个xml文件映射到Java对象。我有一个验证xml的模式。 爪哇类 PersonDetails.xsd 个人详细信息.xml 个人.class personNo返回null。如果我从xsd和xml中删除名称空间和xmlns声明,我可以得到正确的值。 当我尝试使用相同的模式进行Marshall时,我收到了以下错误:

  • 这就给了我一个可以调用的web服务。它使我对发送和返回的xml有了更多的控制,而且还自动完成了编写完整WSDL所需的重复操作。 问题 在模式中,我有一个如下的元素: 所以我想区分用户设置null或blank。然后生成的类具有此属性。 我还尝试手动更改生成的类,使其看起来像这样。 现在这个元素是可选的,但是我仍然不能将它设置为NIL。这样做会导致JAXBElement的值为空白字符串。只有当您关闭模