java - 使用 JAXB 解码 XML

标签 java xml jaxb

我在这里解决了与该主题相关的几乎所有问题。但未能得到合适的解决方案。

我的问题如下:

我创建了一个简单的程序来解码一个我有 xsd 的 xml 文件。我能够成功地做到这一点。但是如果我得到一个没有 xsd 的 xml,如果 xml 看起来像这样,我如何从中获取我的属性:

<items>
  <item>
    <code>12000</code>
    <name>Samsung  620</name>
    <price>9999</price>
  </item>
  <item>
    <code>15000</code>
    <name>NOKIA</name>
    <price>19999</price>
  </item>
  <item>
    <code>18000</code>
    <name>HTC 620</name>
    <price>29999</price>
  </item>
</items> 

这里我没有 xsd 来生成我的类。我该如何进行?请帮助我。

谢谢

最佳答案

以下是您可以使用 JAXB (JSR-222) 映射用例的一种方法实现:

项目

我们将为根对象使用以下类,并使用 @XmlRootElement 对其进行注释。 @XmlRootElement 注释告诉 JAXB,如果要解码的文档中的根元素是 items,则应实例化此类,您还可以指定不同的名称 @XmlRootElement (name="foo").

package forum11152046;

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

@XmlRootElement
public class Items {

    private List<Item> items;

    @XmlElement(name="item")
    public List<Item> getItems() {
        return items;
    }

    public void setItems(List<Item> items) {
        this.items = items;
    }

}

项目

在此示例中,我创建了一个类,其中所有属性名称都直接对应于 XML 文档中的名称。这意味着不需要添加任何注释。如果您需要覆盖默认名称,您可以使用诸如 @XmlElement 之类的注释来实现。我使用 @XmlElement 注释在 Items 类中为 items 属性执行此操作。

package forum11152046;

public class Item {

    private int code;
    private String name;
    private int price;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

}

演示

package forum11152046;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum11152046/input.xml");
        Items items = (Items) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(items, System.out);
    }

}

input.xml/输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<items>
    <item>
        <code>12000</code>
        <name>Samsung  620</name>
        <price>9999</price>
    </item>
    <item>
        <code>15000</code>
        <name>NOKIA</name>
        <price>19999</price>
    </item>
    <item>
        <code>18000</code>
        <name>HTC 620</name>
        <price>29999</price>
    </item>
</items>

关于java - 使用 JAXB 解码 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11152046/

相关文章:

java - 如何使用java计算InputStream的char?

java - Android Constraint Layout Render问题在NestedScrollView中

java - JAXB Marshall 泛型类型的 Map 结构

java - NoClassDefFoundError : com/sun/xml/internal/bind/DatatypeConverterImpl using knopfletfish

java - JAXB 忽略没有注释的 transient 字段

java - Spring Boot 作为 war 与 jar

java - 可执行 jar 找不到属性文件

c# - 如何将xml文件保存到xml列

android - 如何在 Android 中创建带有虚线/点线分隔符的 ListView?

java - 如何拆分XML?一些例子?