JAXB使用xi:include导出到模块化xml文件

JAXB使用xi:include导出到模块化xml文件,xml,jaxb,include,modular,Xml,Jaxb,Include,Modular,我有两个XML文件 tree.xml <tree> <xi:include href="fruit.xml" xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:fallback> <fruit/> </xi:fallback> </xi:include> </tree> fruit.xml

我有两个XML文件

tree.xml

<tree>
    <xi:include href="fruit.xml" xmlns:xi="http://www.w3.org/2001/XInclude">
        <xi:fallback>
            <fruit/>
        </xi:fallback>
    </xi:include>
</tree>

fruit.xml

<fruit>
     ...
</fruit>

...
我继承了代码来解组文件,它返回一个java对象。现在,我需要将单个java对象整理回两个文件。我意识到还有其他解决方案(即使用两个对象而不是一个对象,这是一个选项),但我需要知道是否有可能对单个对象进行马歇尔处理并维护xi:include(或重新引入)并导出到两个(或多个)xml文件

这可能吗?如果有的话,有什么建议/想法吗

谢谢

更新:


我一直在研究这个(我在问之前就研究过)。我确实找到了这个教程,它似乎有我的答案,但当我整理文件时,它取了两个,得到了一个

我找到了答案,至少找到了解决办法。我想这可能是做这件事的方法

我希望JAXB有某种方法来定义对象的一部分作为封送处理的包含,但我从来没有找到任何东西

注意:我有一个额外的黑客,我将在下面解释,我想你可以不用它,但我无法让它工作,在其他人需要这样做的情况下,至少他们会知道

流程如下

  • 一个包含XI:Include的XML文件被解组为java对象。此对象包含两个文件(父文件和包含文件)的内容
  • 对象已更新
  • 该对象被封送回单个临时文件(这就是hack)
  • 单个临时文件被umarshall到DOM文档。(我想直接创建一个DOM文档,但我总是得到一个空的DOM文档,没有例外)
  • 然后,我首先删除需要进入XI:Include的节点,然后插入一个新的XI:Include文件,从而操作DOM文档
  • 将DOM文档转换为xml文件。注意,在我的例子中,XI:include的内容不会改变,但我认为可以将该节点放入一个新文档中并进行转换
  • 我将很快更新代码

    还有其他办法解决这个问题吗

    谢谢,
    Travis

    下面我将演示如何使用
    XmlAdapter
    来支持此用例的编组和解编组

    XmlAdapter(IncludeFruitAdapter)

    此用例可以使用
    XmlAdapter

    导入java.io.File;
    导入javax.xml.bind.*;
    导入javax.xml.bind.annotation.*;
    导入javax.xml.bind.annotation.adapters.XmlAdapter;
    公共类includefruitapter扩展了XmlAdapter{
    私有jaxbcontextjc;
    私有字符串href=“fruit.xml”;
    公共IncludeFruitAdapter(){
    试一试{
    jc=JAXBContext.newInstance(Fruit.class);
    }捕获(例外e){
    抛出新的运行时异常(e);
    }
    }
    公共静态类包括{
    @XmlAttribute
    公共字符串href;
    @XmlElement(命名空间=”http://www.w3.org/2001/XInclude")
    公众退避;
    }
    公共静态类回退{
    @xmlementref
    公众水果价值;
    }
    @凌驾
    公众包括元帅(水果)抛出异常{
    文件xml=新文件(href);
    Marshaller=jc.createMarshaller();
    setProperty(marshaller.JAXB_格式化的_输出,true);
    marshaller.marshall(水果,xml);
    Include=新的Include();
    include.href=href;
    include.fallback=新的回退();
    include.fallback.value=新水果();
    回报包括;
    }
    @凌驾
    公共水果解组(包括)抛出异常{
    文件xml=新文件(include.href);
    Unmarshaller Unmarshaller=jc.createUnmarshaller();
    试一试{
    return(Fruit)unmarshaller.unmarshal(xml);
    }捕获(例外e){
    返回include.fallback.value;
    }
    }
    }
    

    @XmlJavaTypeAdapter
    用于引用
    XmlAdapter

    import javax.xml.bind.annotation.*;
    导入javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    公共类树{
    @XmlJavaTypeAdapter(IncludeFruitAdapter.class)
    @XmlElement(name=“include”,名称空间=”http://www.w3.org/2001/XInclude")
    私家水果;
    }
    
    水果

    import javax.xml.bind.annotation.*;
    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    公共级水果{
    私有字符串名称;
    }
    
    演示

    下面是一些演示代码,您可以运行这些代码来证明一切正常:

    导入java.io.File;
    导入javax.xml.bind.*;
    公开课演示{
    公共静态void main(字符串[]args)引发异常{
    JAXBContext jc=JAXBContext.newInstance(Tree.class);
    Unmarshaller Unmarshaller=jc.createUnmarshaller();
    File xml=新文件(“input.xml”);
    Tree-Tree=(Tree)unmarshaller.unmarshal(xml);
    Marshaller=jc.createMarshaller();
    setProperty(marshaller.JAXB_格式化的_输出,true);
    marshaller.marshall(树、系统、输出);
    }
    }