JAXB XML;如何在不需要创建元素的 pojo 的情况下获取元素的属性?

Posted

技术标签:

【中文标题】JAXB XML;如何在不需要创建元素的 pojo 的情况下获取元素的属性?【英文标题】:JAXB XML; How to fetch an attribute of an element without needing to create a pojo of the element? 【发布时间】:2021-10-29 08:04:10 【问题描述】:

假设我只需要 'child' 的几个属性

<parent>
   <child name="Child" age="1" />
</parent>

我不想创建一个“子”类。我只想包装它并获取属性。这可能吗?我可以使用任何包装器注释吗?

【问题讨论】:

到目前为止的java代码是什么?你试过什么? @Presto 以下提供的代码对您有用吗? @BATMAN_2008 这当然有效,但我希望有更多类似于存储所有内容的 JAXB 对象。而不必为子元素创建一个类。 如果是这种情况,那么您可以使用 @XmlAnyElementsList&lt;Object&gt; 这将存储所有内容。 @Presto 我已经更新了我的代码,并为您提供了另一种方法。 【参考方案1】:

嗯,你可以做到,但如果你不采用传统的方法,那么它会变得非常棘手。这是您可以尝试的代码:

XML:

<parent>
    <child name="Child" age="1" />
</parent>

根:

@XmlRootElement(name = "parent")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Root 
    @XmlJavaTypeAdapter(Adapter.class)
    private String child;

孩子:

@Data
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Child 
    @XmlAttribute
    private String name;

    @XmlAttribute
    private String age;

适配器:

public class Adapter extends XmlAdapter<Child, String> 

    public String unmarshal(Child pC) throws Exception 
        System.out.println(pC.toString());
        return null;
    

    public Child marshal(String pC) throws Exception 
        return null;
    

主要:

public class Main 
    public static void main(String[] args) throws JAXBException, XMLStreamException 
        final InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("sample.xml");
        final XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
        final Unmarshaller unmarshaller = JAXBContext.newInstance(Root.class).createUnmarshaller();
        final Root root = unmarshaller.unmarshal(xmlStreamReader, Root.class).getValue();
        System.out.println(root.toString());
    


输出:

Child(name=Child, age=1)

更新为存储没有子类的所有内容

XML:

<parent>
    <child name="Child" age="1" />
</parent>

根:

@Data
@XmlRootElement(name = "parent")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root 
    @XmlAnyElement
    private List<Object> any;

主要:

public class Main 
    public static void main(String[] args) throws JAXBException, XMLStreamException 
        final InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("sample.xml");
        final XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
        final Unmarshaller unmarshaller = JAXBContext.newInstance(Root.class).createUnmarshaller();
        final Root root = unmarshaller.unmarshal(xmlStreamReader, Root.class).getValue();
        System.out.println(root.toString());

        Marshaller marshaller = JAXBContext.newInstance(Root.class).createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "US-ASCII");
        //marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", new XmlCharacterHandler());
        marshaller.marshal(root, System.out);
    

XML:

Root(any=[[child: null]])
<?xml version="1.0" encoding="US-ASCII"?>
<parent>
   <child age="1" name="Child"/>
</parent>

【讨论】:

以上是关于JAXB XML;如何在不需要创建元素的 pojo 的情况下获取元素的属性?的主要内容,如果未能解决你的问题,请参考以下文章

如果xml元素命名约定与POJO属性命名约定不同,则发送到Spring Boot REST API的XML元素不会映射到POJO

如何使用 JAXB 创建没有价值的 XmlElement

如何使用 JAXB 从 XML 模式生成 Java 枚举?

如何跳过字段并仅使用JAXB解组该字段的特定成员?

如何使用 JAXB2 用动态元素编组 XML

如何通过 JAXB xml 解析获取特定元素?