java - 忽略 JAXB 中的根元素

标签 java xml jaxb

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

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

XML:

<?xml version="1.0" encoding="utf-8"?>
<Root>
<!--  <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="Office.xsd">
-->
    <Office>
        <Employees>
            <Employee>
                <name>George</name>
                <rank>3</rank>
            </Employee>
            <Employee>
                <name>Michael</name>
                <rank>5</rank>
            </Employee>
            <Employee>
                <name>Jeff</name>
                <rank>1</rank>
            </Employee>
            <Employee>
                <name>Todd</name>
                <rank>7</rank>
            </Employee>
            <Employee>
                <name>Jessica</name>
                <rank>5</rank>
            </Employee>
        </Employees>
    </Office>
</Root>

办公类:

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

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

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

}

员工类:

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;

@XmlAccessorType(XmlAccessType.FIELD)
public class Employee {

   @XmlElement(name="name")
   private String name; 
   @XmlElement(name="rank")
   private int rank;


   public void promote() {
      rank++;
   }

}

司机:

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();
         }
      }
}

最佳答案

您可以使用 StAX XMLStreamReader 解析 XML,然后将其推进到您要解码的元素,然后再解码它。

我发布了一个完整的示例,应该有助于解决下面链接的相关问题:

关于java - 忽略 JAXB 中的根元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27462441/

相关文章:

java - 如何在 Android 中声明常量而不使用 public static final

java - 打开 .rskcdesc 的 SAS 风险文件扩展名

java - 解码时出现 JAXB 意外元素

java - 例如,当编码为 XML 时,我可以强制 JAXB 不将“转换为”吗?

java - 对返回数组最小值的方法进行单元测试

java - 使用 BufferedInputStream 下载无法正常工作

java - 解析包含 XML 的字符串后,XML 文档为 null

php - 如何链接在 php mysql 中创建的 RSS feed

java - 添加 XMLAdapter 会导致 JAXBContext.newInstance 方法中出现 NullPointerException

java - 通过 jaxb 和 ant 针对 xsd 生成 java 类