Java 忽略JAXB中的根元素

Java 忽略JAXB中的根元素,java,xml,jaxb,Java,Xml,Jaxb,我正在尝试使用JAXB解析xml文件。 我的问题是,我需要跳过根节点,如果我从xml文件中删除它,我将得到我需要的,否则,我将得到一个空对象 我将给出一个简化的xml和我的代码(其行为方式相同): XML: 司机: import javax.xml.stream.*; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import

我正在尝试使用JAXB解析xml文件。 我的问题是,我需要跳过根节点,如果我从xml文件中删除它,我将得到我需要的,否则,我将得到一个空对象

我将给出一个简化的xml和我的代码(其行为方式相同):

XML:

司机:

import javax.xml.stream.*; 
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.Marshaller;

import java.io.FileReader;
public class Driver {

     public static void main (String[] args) {
        parseOffice();

     }

     public static void parseOffice() {
        try {

          XMLInputFactory f = XMLInputFactory.newInstance();
          XMLStreamReader reader = f.createXMLStreamReader(new FileReader("Office.xml"));

            JAXBContext context = JAXBContext.newInstance(Office.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            Office office = unmarshaller.unmarshal(reader, Office.class).getValue();

            Marshaller marshaller = context.createMarshaller();
          marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
          marshaller.marshal(office, System.out);

         } 
         catch (Exception e) {
             e.printStackTrace();
         }
      }
}

为什么不创建一个通用根元素呢

@XmlRootElement(name="Root" ...)
public class Root {
   @XmlAnyElement(lax=true)
   private Object content;
}

将其添加到您的上下文中并解组。您应该得到一个
JAXBElement
作为
content

只需在层次结构中添加根类即可。并从根类获取Office类

根类:-

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

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {


 @XmlElement(name = "Office")
 private Office office; 
 }
办公室类

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


  @XmlAccessorType(XmlAccessType.FIELD)
  public class Office {

  @XmlElementWrapper(name = "Employees")
  @XmlElement(name = "Employee")
  private Vector<Employee> employees;

  }

您可以使用StAX
XMLStreamReader
解析XML,然后将其前进到要解组的元素,然后解组

我发布了一个完整的例子,可以帮助解决下面链接的相关问题:


我省略了输出,因为帖子足够长,而且可以很容易地复制;不过,如果有必要,我会这样做。当然,我可以这样做——但这不是我想要的理由:如果可能的话,我想知道如何在不添加任何内容的情况下完成。我需要一种忽略或跳过根元素的方法。我想,我应该在我的问题中提到它+1@Michael在任何情况下,你都必须添加一些内容。附加根元素映射或较低级别上的跳过代码。我想说一个额外的根类更好,因为它与其他映射具有相同的抽象级别,并且可以处理任何东西(SAX、StAX、DOM)。然而,你可能有技术上的原因(目前我还不清楚)想拥有它。然后在较低的级别上执行此操作—跳过StAX状态、过滤SAX事件、在DOM中预潜水。出于好奇,我如何将
内容
对象转换为office对象?我可以按照Panther的建议去做,但是有没有一种更通用的方式来转换呢?你把内容限制在
Root
中的
Office
,这是不灵活的。@lexicore谢谢你的输入,我只是想解决他的问题。因为他似乎不想做太多的改变——没问题,这只是一个暗示。而且你说得对,我们的两个答案似乎都不适合OP。这种情况经常发生。
@XmlRootElement(name="Root" ...)
public class Root {
   @XmlAnyElement(lax=true)
   private Object content;
}
import javax.xml.bind.annotation.*;
import java.util.Vector;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {


 @XmlElement(name = "Office")
 private Office office; 
 }
 import javax.xml.bind.annotation.*;
 import java.util.Vector;


  @XmlAccessorType(XmlAccessType.FIELD)
  public class Office {

  @XmlElementWrapper(name = "Employees")
  @XmlElement(name = "Employee")
  private Vector<Employee> employees;

  }
       JAXBContext context = JAXBContext.newInstance(Root.class);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        Root root = unmarshaller.unmarshal(reader, Root.class).getValue();
        Office office = root.getOffice();