1

我试图让 docx4j 支持 MOXy 作为其 JAXB 实现。

我们已经差不多了;见docx4j 和 MOXy

我遇到的问题是我有一堂课

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "http://schemas.openxmlformats.org/wordprocessingml/2006/main", name = "CT_Text", propOrder = {
    "value"
})
@XmlRootElement(name = "t")
public class Text

MOXy 将其编组为 w:delInstrText,而不是 w:t,这是我所期望/希望的,也是 Java 6/参考实现所做的。

架构

        <xsd:element name="t" type="CT_Text">
            <xsd:annotation>
                <xsd:documentation>Text</xsd:documentation>
            </xsd:annotation>
        </xsd:element>

        <xsd:element name="delInstrText" type="CT_Text">
            <xsd:annotation>
                <xsd:documentation>Deleted Field Code</xsd:documentation>
            </xsd:annotation>
        </xsd:element>

FWIW,ObjectFactory 包含:

public Text createText() {
    return new Text();
}

@XmlElementDecl(namespace = "http://schemas.openxmlformats.org/wordprocessingml/2006/main", name = "delInstrText", scope = R.class)
public JAXBElement<Text> createRDelInstrText(Text value) {
    return new JAXBElement<Text>(_RDelInstrText_QNAME, Text.class, R.class, value);
}

这是使用 MOXy 罐子:

        +- org.eclipse.persistence:org.eclipse.persistence.moxy:jar:2.4.1
        |  +- org.eclipse.persistence:org.eclipse.persistence.core:jar:2.4.1
        |  |  \- org.eclipse.persistence:org.eclipse.persistence.asm:jar:3.3.1.v201206041142
        |  \- org.eclipse.persistence:org.eclipse.persistence.antlr:jar:3.2.0.v201206041011             

更新:

这是一个测试用例:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;

import org.docx4j.wml.R;
import org.docx4j.wml.Text;


public class MOXyTest {

    public static void main(String[] args) throws Exception {


        JAXBContext jc = JAXBContext.newInstance("org.docx4j.wml");
//        System.out.println(Version.getVersion());
//        System.out.println(jc.getClass());

        R run = new R();
        Text text = new Text();
        run.getContent().add(text);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(run, System.out);

    }
}
4

1 回答 1

1

注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。


更新

我们已经能够重现您在 EclipseLink 2.4.1 中看到的错误。我们无法在 EclipseLink 2.4.2 或 2.5.0 流中重现该问题。我建议下载最新的 2.4.2 nightly build 并尝试一下:

我们仍在调查这个问题,以确保它得到真正的修复。


原始答案

到目前为止,当 MOXy 用作 JAXB 提供程序时,我无法重现您的问题的结果。您能否提供一些其他信息来帮助我重现您的用例。以下是我迄今为止尝试过的:

Java 模型

我从 GitHub 上的以下位置获取了 Java 模型:

jaxb.properties

我添加了一个jaxb.propertiesorg.docx4j.wml包中调用的文件,以启用 MOXy 作为 JAXB 提供程序。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

演示

下面是我用来尝试重现该问题的演示代码:

package org.docx4j.wml;

import javax.xml.bind.*;
import org.eclipse.persistence.Version;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance("org.docx4j.wml");
        System.out.println(Version.getVersion());
        System.out.println(jc.getClass());

        Text text = new Text();

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(text, System.out);
    }

}

输出

下面是运行演示代码的输出。我看到正确的根元素被t编组而不是问题delInstrText中描述的那样。

2.4.1
class org.eclipse.persistence.jaxb.JAXBContext
<?xml version="1.0" encoding="UTF-8"?>
<ns0:t xmlns:ns2="http://schemas.openxmlformats.org/schemaLibrary/2006/main" xmlns:ns1="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:ns4="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:ns3="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:ns0="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:ns5="http://schemas.openxmlformats.org/officeDocument/2006/relationships"/>
于 2012-11-06T11:10:44.287 回答