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

Jaxb解组(不同的包装元素具有相同的元素)

黄昊
2023-03-14

我有下面的xml结构:

<Response>
<Field1>
    <User>
        <Name>abc</Name>
        <Id>1</Id>  
    </User>
</Field1>   
<Field2>
    <User>
        <Name>sdf</Name>
        <Id>2</Id>  
    </User>
</Field2>   
<Field3>
    <User>
        <Name>xyz</Name>
        <Id>3</Id>  
    </User>
</Field3>
...
</Response>

有不同的 Field(X) 包装器元素,它们包含相同的用户元素。XML 中可以发送 n 个字段。因此,我不能为每个单独的Jaxb。我需要访问用户,但在取消编组步骤后忽略 Field 元素。不幸的是,我无权更改xml结构。我无法找到解决方案。任何指针都会有所帮助。

共有1个答案

范侯林
2023-03-14

您可以对响应(根)类执行类似操作:


@XmlRootElement(name = "Response")
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
    @XmlElements(value = {
            @XmlElement(name = "Field1", type = Field.class),
            @XmlElement(name = "Field2", type = Field.class),
            @XmlElement(name = "Field3", type = Field.class)
    })
    private Field field;
}

JAXB 会在遇到不同的 Field 时自动映射到字段类。

编辑/更新

XML:

<Response>
    <Field1>
        <Name>abc</Name>
        <Id>1</Id>
    </Field1>
    <Field2>
        <Name>sdf</Name>
        <Id>2</Id>
    </Field2>
    <Field3>
        <Name>xyz</Name>
        <Id>3</Id>
    </Field3>
</Response>

根:

@XmlRootElement(name = "Response")
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
    @XmlAnyElement
    private List<Field> action;
}

田:

@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class Field {
    private String Name;
    private String Id;
}

主要:

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_FRAGMENT, Boolean.TRUE);
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        marshaller.marshal(root, System.out);
    }
}

输出:

Root(action=[[Field1: null], [Field2: null], [Field3: null]])
<Response>
   <Field1>
      <Name>abc</Name>
      <Id>1</Id>
   </Field1>
   <Field2>
      <Name>sdf</Name>
      <Id>2</Id>
   </Field2>
   <Field3>
      <Name>xyz</Name>
      <Id>3</Id>
   </Field3>
</Response>
 类似资料:
  • 有太多关于大致相同主题的问题,但我找不到我想要的。如果我错过了,我很抱歉。 我正在尝试散集具有公共逻辑元素但使用不同标记定义的XML文件: 两个<代码> 我可以这样做: 所需要的只是在和中实现并分别返回或。 然而,在中有一个属性并以某种方式告诉JAXB将这两个字段映射到它似乎更简单。 我是不是想多了?你将如何实现它? (当然,我无法控制输入XML。如果可能的话,我还想避免使用MOXy的解决方案,因

  • 您好帮助请把xml文件放在里面一些相同的元素,这些元素的内容不同,“name”属性。这些元素有不同的项目集,如何进行解咒?断续器: 我需要在Cdb和FmssSc中执行对象2的解组。我的尝试:通用元素-ServiceBroker.class 适配器.class Cdb.class FmssSc.class 演示: 错误:

  • 我有这种结构的xml文件: 有没有可能将这种XML解组到一个对象中。问题是每个元素都有一些独特的标签。我想把这些值放到列表中,但是我不知道怎么做。

  • 这是我的xml结构 因此,我尝试使用JAXB解组将这个xml绑定到一个类,但结果一无所获。 我在想,我有两个基本元素,课程和科目,所以我根据这些元素建立了两个类 此选项用于控制课程标签 这是为了控制主题标签。 我做了一些字符串函数,结果什么都没有。有什么问题吗?

  • 问题内容: 我的类中有很多div,并且我想使用jquery遍历它们以检查每个div是否满足特定条件。如果为真,则应执行一个操作。 有人知道我会怎么做吗? 问题答案: 使用每个:’ ‘是数组中的位置,是您要迭代的DOM对象(也可以通过jQuery包装器进行访问)。 检查api参考以获取更多信息。

  • 问题内容: 这样的情况有效吗? 问题答案: 没有。 元素ID在整个文档中应该是唯一的。