Java 测试大型文档映射的Jaxb策略

Java 测试大型文档映射的Jaxb策略,java,jaxb,Java,Jaxb,我们正在与Jaxb合作,以解组一个大型深度嵌套文档。Xjc无法使用该模式,因此我们必须手动映射它。这里有关于测试策略的建议吗 我想我希望在编写过程中为每个嵌套类编写映射测试,最好使用小XML片段,而不是使用完整文档的许多变体。但是,由于名称空间问题,我不知道如何做到这一点。这是我想验证的一个片段: <responsibleParty> <gmd:individualName> <gco:CharacterString>Someones

我们正在与Jaxb合作,以解组一个大型深度嵌套文档。Xjc无法使用该模式,因此我们必须手动映射它。这里有关于测试策略的建议吗

我想我希望在编写过程中为每个嵌套类编写映射测试,最好使用小XML片段,而不是使用完整文档的许多变体。但是,由于名称空间问题,我不知道如何做到这一点。这是我想验证的一个片段:

<responsibleParty>
    <gmd:individualName>
        <gco:CharacterString>Someones name</gco:CharacterString>
    </gmd:individualName>
</responsibleParty>

某人的名字
我看不出有什么办法可以做到这一点。对这里的策略有什么建议吗


谢谢

如果您看到的问题是由于根据您提供的链接,嵌套类与父类具有相同的名称造成的:

然后,您可以通过使用外部绑定文件来解决此问题:

recursive.xml

绑定文件允许您重命名嵌套类以避免名称冲突

<jaxb:bindings 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">
    <jaxb:bindings schemaLocation="recursive.xsd">
        <jaxb:bindings node="/xsd:schema/xsd:element[@name='topic']/xsd:complexType/xsd:sequence/xsd:element[@name='topic']/xsd:complexType">
            <jaxb:class name="Topic2"/>
        </jaxb:bindings>
        <jaxb:bindings node="/xsd:schema/xsd:element[@name='topic']/xsd:complexType/xsd:sequence/xsd:element[@name='topic']/xsd:complexType/xsd:sequence/xsd:element[@name='topic']/xsd:complexType">
            <jaxb:class name="Topic3"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>
主题(生成的类)

生成包;
导入java.util.ArrayList;
导入java.util.List;
导入javax.xml.bind.annotation.XmlAccessType;
导入javax.xml.bind.annotation.XmlAccessorType;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
导入javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=),比例={
“主题”
})
@XmlRootElement(name=“topic”)
公开课主题{
@XmlElement(必需=true)
受保护的Topic.Topic2主题;
public Topic.Topic2 getTopic(){
返回主题;
}
public void setTopic(Topic.Topic2值){
this.topic=值;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=),比例={
“主题”
})
公共静态类主题2{
@XmlElement(必需=true)
受保护的Topic.Topic2.Topic3主题;
public Topic.Topic2.Topic3 getTopic(){
返回主题;
}
public void setTopic(Topic.Topic2.Topic3值){
this.topic=值;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=),比例={
“主题”
})
公共静态类主题3{
受保护列表主题;
公共列表getTopic(){
if(主题==null){
topic=newarraylist();
}
返回此.topic;
}
}
}
}

根据您提供的链接,如果您看到的问题是由于嵌套类与父类具有相同的名称造成的:

然后,您可以通过使用外部绑定文件来解决此问题:

recursive.xml

绑定文件允许您重命名嵌套类以避免名称冲突

<jaxb:bindings 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">
    <jaxb:bindings schemaLocation="recursive.xsd">
        <jaxb:bindings node="/xsd:schema/xsd:element[@name='topic']/xsd:complexType/xsd:sequence/xsd:element[@name='topic']/xsd:complexType">
            <jaxb:class name="Topic2"/>
        </jaxb:bindings>
        <jaxb:bindings node="/xsd:schema/xsd:element[@name='topic']/xsd:complexType/xsd:sequence/xsd:element[@name='topic']/xsd:complexType/xsd:sequence/xsd:element[@name='topic']/xsd:complexType">
            <jaxb:class name="Topic3"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>
主题(生成的类)

生成包;
导入java.util.ArrayList;
导入java.util.List;
导入javax.xml.bind.annotation.XmlAccessType;
导入javax.xml.bind.annotation.XmlAccessorType;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
导入javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=),比例={
“主题”
})
@XmlRootElement(name=“topic”)
公开课主题{
@XmlElement(必需=true)
受保护的Topic.Topic2主题;
public Topic.Topic2 getTopic(){
返回主题;
}
public void setTopic(Topic.Topic2值){
this.topic=值;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=),比例={
“主题”
})
公共静态类主题2{
@XmlElement(必需=true)
受保护的Topic.Topic2.Topic3主题;
public Topic.Topic2.Topic3 getTopic(){
返回主题;
}
public void setTopic(Topic.Topic2.Topic3值){
this.topic=值;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=),比例={
“主题”
})
公共静态类主题3{
受保护列表主题;
公共列表getTopic(){
if(主题==null){
topic=newarraylist();
}
返回此.topic;
}
}
}
}

Yikes!为什么xjc不在模式上工作?自动化工具绝对是这里的最佳选择!修复XSD比尝试编写一个覆盖所有边界条件的测试用例要好…模式是由其他组设置的,因此我无法修复它,尽管我不确定它是否已损坏。我已经完成了绑定映射,所以我可以让XJC运行。但是结果代码不会编译,模式使用递归嵌套,xjc似乎无法处理这一问题。我碰到了这个问题[我还没有尝试手动映射这个问题,看看是否可以解决。哎呀!为什么xjc不在模式上工作?在这里,一个自动工具绝对是最好的选择!修复XSD比尝试编写一个测试用例来覆盖所有边界条件更好…模式是由其他组设置的,所以我无法修复它,尽管我不确定它被破坏了。我处理了绑定映射,以便让XJC运行。但是生成的代码无法编译,模式使用递归嵌套,XJC似乎无法处理。我遇到了这个问题[我还没有尝试手动映射,看看是否可以处理它]。
xjc -d out -b recursive.xml recursive.xsd
package generated;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "topic"
})
@XmlRootElement(name = "topic")
public class Topic {

    @XmlElement(required = true)
    protected Topic.Topic2 topic;

    public Topic.Topic2 getTopic() {
        return topic;
    }

    public void setTopic(Topic.Topic2 value) {
        this.topic = value;
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "topic"
    })
    public static class Topic2 {

        @XmlElement(required = true)
        protected Topic.Topic2 .Topic3 topic;

        public Topic.Topic2 .Topic3 getTopic() {
            return topic;
        }

        public void setTopic(Topic.Topic2 .Topic3 value) {
            this.topic = value;
        }

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = {
            "topic"
        })
        public static class Topic3 {

            protected List<String> topic;

            public List<String> getTopic() {
                if (topic == null) {
                    topic = new ArrayList<String>();
                }
                return this.topic;
            }

        }

    }

}