Java 忽略JAXB中的根元素
我正在尝试使用JAXB解析xml文件。 我的问题是,我需要跳过根节点,如果我从xml文件中删除它,我将得到我需要的,否则,我将得到一个空对象 我将给出一个简化的xml和我的代码(其行为方式相同): XML: 司机: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
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,然后将其前进到要解组的元素,然后解组
我发布了一个完整的例子,可以帮助解决下面链接的相关问题:
内容对象转换为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();