gpt4 book ai didi

java - 动态 XML 标记和 JAXB

转载 作者:数据小太阳 更新时间:2023-10-29 02:04:05 25 4
gpt4 key购买 nike

考虑到不需要标记 complement123 并且 XML,我如何使用 JAXB 序列化和反序列化以下 XML可能有 complement45n

我考虑过使用 @XmlAnyElement 注释,但我需要知道值“First”属于第一个补码,“Second”属于第二个补码,依此类推。

<resource>
<id>Identifier</id>
<name>Name</name>
<complement1>First</complement1>
<complement2>Second</complement2>
<complement3>Third</complement3>
</resource>

最佳答案

我相信您可以使用@XmlAnyElement,并且您确实可以访问元素名称。
您需要使用“任意列表”结构。
当 JAXB 解码 XML 时,您将得到一个 DOM 元素对象列表,每个对象都包含元素名称和内容。
我认为您必须手动强制每个元素标签名称匹配“complementN”模式。

例如这是从 Oracle 示例之一修改而来的:

架构:

<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:sequence>
</xs:complexType>
</xs:element>

xjc 生成的 Person 类的片段:

...
@XmlRootElement(name = "person")
public class Person {

@XmlElement(required = true)
protected String firstname;
@XmlElement(required = true)
protected String lastname;
@XmlAnyElement(lax = true)
protected List<Object> any;
...

测试 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<person>
<firstname>David</firstname>
<lastname>Francis</lastname>
<anyItem1>anyItem1Value</anyItem1>
<anyItem2>anyItem2Value</anyItem2>
</person>

测试类:

JAXBContext jc = JAXBContext.newInstance( "generated" );
Unmarshaller u = jc.createUnmarshaller();
Person contents = (Person) u.unmarshal(Testit.class.getResource("./anysample_test1.xml"));
System.out.println("contents: " + contents);
System.out.println(" firstname: " + contents.getFirstname());
System.out.println(" lastname: " + contents.getLastname());
System.out.println(" any: ");
for (Object anyItem : contents.getAny()) {
System.out.println(" any item: " + anyItem);
Element ele = (Element) anyItem;
System.out.println(" ele name: " + ele.getTagName());
System.out.println(" ele text content: " + ele.getTextContent());
}

输出:

contents: generated.Person@1bfc93a
firstname: David
lastname: Francis
any:
any item: [anyItem1: null]
ele name: anyItem1
ele text content: anyItem1Value
any item: [anyItem2: null]
ele name: anyItem2
ele text content: anyItem2Value

关于java - 动态 XML 标记和 JAXB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10637192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com