当前位置: 首页 > 知识库问答 >
问题:

如何使用Jackson用流式API解析XML文件

林祯
2023-03-14

共有1个答案

杨建章
2023-03-14

读取树结构需要进程启动(例如,XML的 ,或者JSON的{/[)。

让根包装器和一大串汽车(为了简洁起见,我使用lombok注释):

@Getter
@Setter
@JacksonXmlRootElement
@NoArgsConstructor
@AllArgsConstructor
static class CarBook {
    @JacksonXmlProperty(isAttribute = true)
    private int version;
    @JacksonXmlElementWrapper(localName = "cars")
    @JacksonXmlProperty(localName = "car")
    private List<Car> cars;
}

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
static class Car {
    private String model;
    private String plate;
}

然后,在完全读取所有列表(可能是其他成员)之前,无法获得carbook对象。

/**
 * Method for reading a single XML value from given XML-specific input
 * source; useful for incremental data-binding, combining traversal using
 * basic Stax {@link XMLStreamReader} with data-binding by Jackson.
 * 
 * @since 2.4
 */
public <T> T readValue(XMLStreamReader r, Class<T> valueType) throws IOException {
    return readValue(r, _typeFactory.constructType(valueType));
} 

例如,让大的(1,2g)文件

<CarBook version="1"><cars>
<car><model>Alfa Romeo Spider</model><plate>27437</plate></car>
<car><model>Almera</model><plate>6429</plate></car>
<car><model>Audi 80 and 90</model><plate>4898</plate></car>
<car><model>Audi A3</model><plate>21259</plate></car>
<car><model>Audi A4</model><plate>21056</plate></car>
<car><model>Audi Coupé</model><plate>5623</plate></car>
<car><model>Austin Metro</model><plate>26446</plate></car>
<car><model>BMW 3 Series</model><plate>16338</plate></car>
<car><model>BMW 5 Series</model><plate>29859</plate></car>
...

的,你可以懒洋洋地阅读

public static void main(String... args) throws IOException, XMLStreamException {
    XmlMapper xm = new XmlMapper();
    XMLInputFactory xif = XMLInputFactory.newInstance();
    XMLStreamReader xr = xif.createXMLStreamReader(new FileInputStream(/* 1,2G file */ "/home/josejuan/tmp/all.cars.xml"));

    // you must to read step by step
    while (xr.hasNext()) {
        xr.next();
        if (xr.getEventType() == START_ELEMENT) {
            System.out.println(xr.getLocalName());
            if ("car".equals(xr.getLocalName())) {
                Car car = xm.readValue(xr, Car.class);
                System.out.println(car);
                if ("21056".equals(car.getPlate()))
                    break;
            }
        }
    }

    System.out.println("== End Of Process ==");
}

有输出

CarBook
cars
car
WithLazyJackson.Car(model=Alfa Romeo Spider, plate=27437)
car
WithLazyJackson.Car(model=Almera, plate=6429)
car
WithLazyJackson.Car(model=Audi 80 and 90, plate=4898)
car
WithLazyJackson.Car(model=Audi A3, plate=21259)
car
WithLazyJackson.Car(model=Audi A4, plate=21056)
== End Of Process ==
 类似资料:
  • 我有一个XML文件,其中包含大量员工记录(比如高达1M),如下所示: 我使用JAXB将员工记录映射到以下Java对象: XML的内容不能被更改,并且给定这个XML,我如何使用JAXB将每个员工XML记录解封给员工对象,以便我可以逐个处理它?

  • 谁能帮我找出我在这里做错了什么。我必须解析下面的XML字符串 为此,我有三个bean要映射,如下所示 我试图像下面这样解析 我使用的是jackson-dataformat-xml版本2.9.8。

  • 我在通过邮递员传递json数据时遇到问题。如果Mandetory日期带有注释,没问题。另一个日期接受null。但是在更新时,该日期会产生问题。我使用Java1.8与Spring启动 以下链接我已经访问过,但不适合这个。杰克逊JSON解析错误的LocalDateTime解析:无法构造java.time.LocalDate的实例:没有String参数构造函数/工厂方法从String值反序列化https

  • 问题内容: 我如何在Java或C中使用vtd-xml解析如下的xml文件? 任何帮助,将不胜感激。 谢谢 问题答案: 我想其中有些取决于您要如何解析文件。 这是一个“非生产”示例,其中使用了一些有用的技术,包括: XPath选择(此处仅使用“ / *”) 浏览所有同级节点 通过子节点向下看 使用AutoPilot将节点属性提取到地图中 希望能帮助到你 产生以下输出: 添加带有AutoPilot循环

  • 如何在java或C中使用vtd xml解析如下xml文件? 任何帮助都将不胜感激。 谢谢

  • 我有这个文件要处理,我正试图找出如何将第二行作为不同的对象来读取。在这一行的末尾,最后一项是公交车的数量。第二行、第四行等应包含idBus和noOfBus,并用逗号分隔。 基于这些课程 我想要一个函数来处理CSV文件中所有公交车和大学线路的列表。它必须使用流API。我不知道这是否可能或如何进行。 当然,可以根据类进行更改,但保留变量,不添加任何额外内容。 我认为最方便的方法是浏览文件,根据两个班级