首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态XML标记和JAXB

动态XML标记和JAXB
EN

Stack Overflow用户
提问于 2012-05-17 22:01:24
回答 1查看 2.5K关注 0票数 4

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

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

代码语言:javascript
复制
<resource>
    <id>Identifier</id>
    <name>Name</name>
    <complement1>First</complement1>
    <complement2>Second</complement2>
    <complement3>Third</complement3>
</resource>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-17 23:03:24

我相信您可以使用@XmlAnyElement,并且您确实可以访问元素名称。

你需要使用一个"List of any“结构。

当JAXB对XML进行解组时,您将得到一个DOM Element对象列表,每个对象都包含元素名称和内容。

我认为您必须手动强制每个元素标记名与"complementN“模式匹配。

例如,这是根据Oracle示例之一进行修改的:

模式:

代码语言:javascript
复制
<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类的代码片段:

代码语言:javascript
复制
...
@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文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<person>
  <firstname>David</firstname>
  <lastname>Francis</lastname>
  <anyItem1>anyItem1Value</anyItem1>
  <anyItem2>anyItem2Value</anyItem2>
</person>

测试类:

代码语言:javascript
复制
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());
}

输出:

代码语言:javascript
复制
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
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10637192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档