Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 困难的JAXB映射_Java_Jaxb - Fatal编程技术网

Java 困难的JAXB映射

Java 困难的JAXB映射,java,jaxb,Java,Jaxb,我试图在一个更大的文档中映射以下XML结构,显然这不是XML的最大用途,但这是我必须处理的 为清晰起见,简化了示例: <details> <pictures> <picture1> http://domain.com/path/picture1.jpg </picture1> <picture2> http://domain.com/path/picture

我试图在一个更大的文档中映射以下XML结构,显然这不是XML的最大用途,但这是我必须处理的

为清晰起见,简化了示例:

  <details>
    <pictures>
      <picture1>
        http://domain.com/path/picture1.jpg
      </picture1>
      <picture2>
        http://domain.com/path/picture2.jpg
      </picture2>
      <picture3>
        http://domain.com/path/picture3.jpg
      </picture3>
      <picture4>
        http://domain.com/path/picture4.jpg
      </picture4>
      <picture5>
        http://domain.com/path/picture5.jpg
      </picture5>
      <picture6>
        http://domain.com/path/picture6.jpg
      </picture6>
      <picture7>
        http://domain.com/path/picture7.jpg
      </picture7>
    </pictures>
  </details>

http://domain.com/path/picture1.jpg
http://domain.com/path/picture2.jpg
http://domain.com/path/picture3.jpg
http://domain.com/path/picture4.jpg
http://domain.com/path/picture5.jpg
http://domain.com/path/picture6.jpg
http://domain.com/path/picture7.jpg
本文档有一个DTD,它声明最多有30个不同的图片元素,编号为1-30,名称为

我想做的是,而不是为这些元素中的每一个创建30个不同的类,称为Picture1、Picture2、Picture3。。。等等我只想使用一个Picture类,并将其用于所有30个唯一的元素名称

以下是我到目前为止所做的尝试

@XmlRootElement
public class Details {

   ...

   @XmlElementWrapper
   @XmlElementRefs({
        @XmlElementRef( name="picture1", type=Picture.class ),
        @XmlElementRef( name="picture2", type=Picture.class ),
        @XmlElementRef( name="picture3", type=Picture.class ),
        @XmlElementRef( name="picture4", type=Picture.class ),
        @XmlElementRef( name="picture5", type=Picture.class ),
        @XmlElementRef( name="picture6", type=Picture.class ),
        @XmlElementRef( name="picture7", type=Picture.class ),
        @XmlElementRef( name="picture8", type=Picture.class ),
        @XmlElementRef( name="picture9", type=Picture.class ),
        @XmlElementRef( name="picture10", type=Picture.class ),
        @XmlElementRef( name="picture11", type=Picture.class ),
        @XmlElementRef( name="picture12", type=Picture.class ),
        @XmlElementRef( name="picture13", type=Picture.class ),
        @XmlElementRef( name="picture14", type=Picture.class ),
        @XmlElementRef( name="picture15", type=Picture.class ),
        @XmlElementRef( name="picture16", type=Picture.class ),
        @XmlElementRef( name="picture17", type=Picture.class ),
        @XmlElementRef( name="picture18", type=Picture.class ),
        @XmlElementRef( name="picture19", type=Picture.class ),
        @XmlElementRef( name="picture20", type=Picture.class ),
        @XmlElementRef( name="picture21", type=Picture.class ),
        @XmlElementRef( name="picture22", type=Picture.class ),
        @XmlElementRef( name="picture23", type=Picture.class ),
        @XmlElementRef( name="picture24", type=Picture.class ),
        @XmlElementRef( name="picture25", type=Picture.class ),
        @XmlElementRef( name="picture26", type=Picture.class ),
        @XmlElementRef( name="picture27", type=Picture.class ),
        @XmlElementRef( name="picture28", type=Picture.class ),
        @XmlElementRef( name="picture29", type=Picture.class ),
        @XmlElementRef( name="picture30", type=Picture.class )
    })
   public List<Picture> getPictures() {
      return this.pictures;
   }

   public void setPictures( List<Pictures> pictures ) {
      this.pictures = pictures;
   }

   ...

}

@XmlElementWrapper
public class Picture {
 ...
}
@XmlRootElement
公开课详情{
...
@XmlElementWrapper
@XmlElementRefs({
@xmlementref(name=“picture1”,type=Picture.class),
@xmlementref(name=“picture2”,type=Picture.class),
@xmlementref(name=“picture3”,type=Picture.class),
@xmlementref(name=“picture4”,type=Picture.class),
@xmlementref(name=“picture5”,type=Picture.class),
@xmlementref(name=“picture6”,type=Picture.class),
@xmlementref(name=“picture7”,type=Picture.class),
@xmlementref(name=“picture8”,type=Picture.class),
@xmlementref(name=“picture9”,type=Picture.class),
@xmlementref(name=“picture10”,type=Picture.class),
@xmlementref(name=“picture11”,type=Picture.class),
@xmlementref(name=“picture12”,type=Picture.class),
@xmlementref(name=“picture13”,type=Picture.class),
@xmlementref(name=“picture14”,type=Picture.class),
@xmlementref(name=“picture15”,type=Picture.class),
@xmlementref(name=“picture16”,type=Picture.class),
@xmlementref(name=“picture17”,type=Picture.class),
@xmlementref(name=“picture18”,type=Picture.class),
@xmlementref(name=“picture19”,type=Picture.class),
@xmlementref(name=“picture20”,type=Picture.class),
@xmlementref(name=“picture21”,type=Picture.class),
@xmlementref(name=“picture22”,type=Picture.class),
@xmlementref(name=“picture23”,type=Picture.class),
@xmlementref(name=“picture24”,type=Picture.class),
@xmlementref(name=“picture25”,type=Picture.class),
@xmlementref(name=“picture26”,type=Picture.class),
@xmlementref(name=“picture27”,type=Picture.class),
@xmlementref(name=“picture28”,type=Picture.class),
@xmlementref(name=“picture29”,type=Picture.class),
@xmlementref(name=“picture30”,type=Picture.class)
})
公共列表getPictures(){
归还这张照片;
}
公共图片(列出图片){
这个。图片=图片;
}
...
}
@XmlElementWrapper
公开课图片{
...
}
这会导致getPictures始终返回null

此外,我还尝试将Picture类上的注释更改为
@xmlementwrapper(name=“picture1”)
,这导致我得到一个从getPictures()返回的列表,但它只包含
元素,而不包含其余元素


我知道我可以求助于获取JAXBElement对象的列表,但如果可以避免的话,我宁愿不要。您知道如何映射此用例吗?

有几种方法可以处理此用例:

选项#1

通过利用
@xmlements
,您可以做到以下几点:

package forum10109418;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Details {

   private List<Picture> pictures;

   @XmlElementWrapper
   @XmlElements({
       @XmlElement( name="picture1", type=Picture.class ),
       @XmlElement( name="picture2", type=Picture.class ),
       @XmlElement( name="picture3", type=Picture.class ),
       @XmlElement( name="picture4", type=Picture.class ),
       @XmlElement( name="picture5", type=Picture.class ),
       @XmlElement( name="picture6", type=Picture.class ),
       @XmlElement( name="picture7", type=Picture.class ),
       @XmlElement( name="picture8", type=Picture.class ),
       @XmlElement( name="picture9", type=Picture.class ),
       @XmlElement( name="picture10", type=Picture.class ),
       @XmlElement( name="picture11", type=Picture.class ),
       @XmlElement( name="picture12", type=Picture.class ),
       @XmlElement( name="picture13", type=Picture.class ),
       @XmlElement( name="picture14", type=Picture.class ),
       @XmlElement( name="picture15", type=Picture.class ),
       @XmlElement( name="picture16", type=Picture.class ),
       @XmlElement( name="picture17", type=Picture.class ),
       @XmlElement( name="picture18", type=Picture.class ),
       @XmlElement( name="picture19", type=Picture.class ),
       @XmlElement( name="picture20", type=Picture.class ),
       @XmlElement( name="picture21", type=Picture.class ),
       @XmlElement( name="picture22", type=Picture.class ),
       @XmlElement( name="picture23", type=Picture.class ),
       @XmlElement( name="picture24", type=Picture.class ),
       @XmlElement( name="picture25", type=Picture.class ),
       @XmlElement( name="picture26", type=Picture.class ),
       @XmlElement( name="picture27", type=Picture.class ),
       @XmlElement( name="picture28", type=Picture.class ),
       @XmlElement( name="picture29", type=Picture.class ),
       @XmlElement( name="picture30", type=Picture.class )
   })

   public List<Picture> getPictures() {
      return this.pictures;
   }

   public void setPictures( List<Picture> pictures ) {
      this.pictures = pictures;
   }

}
然后使用
StreamReaderDelegate
切掉数字后缀:

package forum10109418;

import java.io.FileInputStream;
import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.stream.util.StreamReaderDelegate;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Details.class);

        XMLInputFactory xif = XMLInputFactory.newFactory();
        XMLStreamReader xsr = xif.createXMLStreamReader(new FileInputStream("src/forum10109418/input.xml"));
        xsr = new StreamReaderDelegate(xsr) {
            @Override
            public String getLocalName() {
                String localName = super.getLocalName();
                if(localName.startsWith("picture") && !localName.equals("pictures")) {
                    return "picture";
                }
                return localName;
            }

        };
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Details details = (Details) unmarshaller.unmarshal(xsr);
        System.out.println(details.getPictures().size());
    }

}
选项#3

如果您使用的是提供程序,那么您可以使用我们添加的
@XmlVariableNode
扩展:


有几种方法可以处理此用例:

选项#1

通过利用
@xmlements
,您可以做到以下几点:

package forum10109418;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Details {

   private List<Picture> pictures;

   @XmlElementWrapper
   @XmlElements({
       @XmlElement( name="picture1", type=Picture.class ),
       @XmlElement( name="picture2", type=Picture.class ),
       @XmlElement( name="picture3", type=Picture.class ),
       @XmlElement( name="picture4", type=Picture.class ),
       @XmlElement( name="picture5", type=Picture.class ),
       @XmlElement( name="picture6", type=Picture.class ),
       @XmlElement( name="picture7", type=Picture.class ),
       @XmlElement( name="picture8", type=Picture.class ),
       @XmlElement( name="picture9", type=Picture.class ),
       @XmlElement( name="picture10", type=Picture.class ),
       @XmlElement( name="picture11", type=Picture.class ),
       @XmlElement( name="picture12", type=Picture.class ),
       @XmlElement( name="picture13", type=Picture.class ),
       @XmlElement( name="picture14", type=Picture.class ),
       @XmlElement( name="picture15", type=Picture.class ),
       @XmlElement( name="picture16", type=Picture.class ),
       @XmlElement( name="picture17", type=Picture.class ),
       @XmlElement( name="picture18", type=Picture.class ),
       @XmlElement( name="picture19", type=Picture.class ),
       @XmlElement( name="picture20", type=Picture.class ),
       @XmlElement( name="picture21", type=Picture.class ),
       @XmlElement( name="picture22", type=Picture.class ),
       @XmlElement( name="picture23", type=Picture.class ),
       @XmlElement( name="picture24", type=Picture.class ),
       @XmlElement( name="picture25", type=Picture.class ),
       @XmlElement( name="picture26", type=Picture.class ),
       @XmlElement( name="picture27", type=Picture.class ),
       @XmlElement( name="picture28", type=Picture.class ),
       @XmlElement( name="picture29", type=Picture.class ),
       @XmlElement( name="picture30", type=Picture.class )
   })

   public List<Picture> getPictures() {
      return this.pictures;
   }

   public void setPictures( List<Picture> pictures ) {
      this.pictures = pictures;
   }

}
然后使用
StreamReaderDelegate
切掉数字后缀:

package forum10109418;

import java.io.FileInputStream;
import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.stream.util.StreamReaderDelegate;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Details.class);

        XMLInputFactory xif = XMLInputFactory.newFactory();
        XMLStreamReader xsr = xif.createXMLStreamReader(new FileInputStream("src/forum10109418/input.xml"));
        xsr = new StreamReaderDelegate(xsr) {
            @Override
            public String getLocalName() {
                String localName = super.getLocalName();
                if(localName.startsWith("picture") && !localName.equals("pictures")) {
                    return "picture";
                }
                return localName;
            }

        };
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Details details = (Details) unmarshaller.unmarshal(xsr);
        System.out.println(details.getPictures().size());
    }

}
选项#3

如果您使用的是提供程序,那么您可以使用我们添加的
@XmlVariableNode
扩展:


喜欢选项2,因为它允许将来使用30多个元素,但现在使用选项1。感谢选项2应该谨慎使用:编组不会返回数字:),但使用类似的代码可以实现这一点。嗨,布莱斯!我也遇到过类似的问题,我无法解决。你能看一看问题吗?像选项2一样,因为它允许将来使用30多个元素,但现在使用选项1。感谢选项2应该谨慎使用:编组不会返回数字:),但使用类似的代码可以实现这一点。嗨,布莱斯!我也遇到过类似的问题,我无法解决。你能看看我的问题吗?