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

Jaxb混合XmlElement和XmlValue

燕承安
2023-03-14

我正在尝试创建一个可以同时包含元素和值的java/jaxb类。

我想在A类的列表中读取一个类的属性,并作为A类本身的值输出。

这是XML:

我必须阅读:

<data>
    <device id=”DEV123”>
        <error id=”ERR1”/> 
    </device>
</data>

并生产:

<data>
    <device id="DEV123">ERR1</device>
</data>

这是我的错误类-工作正常:

@XmlRootElement(name = "error")
public class Error implements Serializable {
private String id;


@XmlAttribute(name ="id")
public String getId() {

    return id;
}

public void setId(String id ){

    this.id = id;
}

}

我的设备类别:

@XmlRootElement(name = "device")
public class Device implements Serializable {


    private String id;
    private String device;
    private ArrayList<Error> errorList;


    @XmlElement
    public ArrayList<Error> getErrorList() {
        return errorList;
    }

    @XmlAttribute(name = "id") 
    public String getId() {

        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

    @XmlValue
    public String getDevice(){
        return this.device;
    }



}

Jaxb 抱怨我不能在同一类中同时拥有 xml 元素(错误 )和 xml 值

"If a class has @XmlElement property, it cannot have @XmlValue property."

如何正确建模/注释此内容,以允许我读取 error xml 标记的属性并将其生成为设备标记的值?

共有1个答案

茹照
2023-03-14

您可以执行以下操作:

@XmlMixed
public String getDevice(){
    return this.device;
}

@XmlMixed注释的属性将选取任何文本字符,无论它是否为空格。如果属性是一个集合,那么如果遇到的不是每一段文本都会清除最后一个文本,它将拾取所有内容。因此,您需要在解析时消除空格。

import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

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

        XMLInputFactory xif = XMLInputFactory.newFactory();
        XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource("src/forum22284324/input.xml"));
        xsr = xif.createFilteredReader(xsr, new StreamFilter() {

            @Override
            public boolean accept(XMLStreamReader reader) {
                if(reader.getEventType() == XMLStreamReader.CHARACTERS) {
                    return reader.getText().trim().length() > 0;
                } 
                return true;
            }

        });

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Root root = (Root) unmarshaller.unmarshal(xsr);
    }

}

相关示例

    < li>JAXB混合内容列表包含换行符
 类似资料:
  • 我在这里看到了一个类似的问题,但它并没有帮助我解决这个问题,所以我在这里发布我的问题,看看是否有人可以修改我的代码使其工作。 问:如何访问混合内容字符串值并将其保存在 setPhrase(字符串值)方法中? 标题.xml: 标题.java: 在使用JAXB解组和编组之后,我能够将所有内容转换为和对象并保存为相应的内容,但实际短语“Hello World”除外。我知道我必须为这个复杂的元素使用某种@

  • 问题内容: 我有下一个html,我想解析: 我下一堂课: 和: 现在,我还需要span的值(“ bla bla”)。所以我添加到类中: 有点给我下一个错误: 我尝试使用@XMLMixed,但没有成功。我会很高兴例如代码示例。谢谢。 问题答案: 更新 可以同时具有文本和元素的子注释的任何元素都称为混合内容。在JAXB中,这对应于注释。 可以在自家的集合属性使用(见原来的答复),或组合,或。如果该元素

  • 嗨,我正在解组一个XML文件,该文件有一个标记,可以包含值或元素列表。我想知道解组这种XML的最佳方法是什么。例子: 我无法改变XML的构建方式,因此我希望有人能给出答案。非常感谢。

  • 我有这个类结构来序列化TreeGrid(www.TreeGrid.com)对象: 数据网格.java 和 数据网格数据.java 这些类将被处理以返回XML结构,如下所示: 但是封装在B中的信息可能不同(因此在< code>DataGridData类中存在由同一个< code>XmlElement映射的两个属性)。 如果我在Java 7下运行我的项目,这一切都没问题,但是在Java 8下会引发一个

  • 我认为使用插曲有一些问题(它们不包括简单类型?)和注释?有解决这个问题的办法吗?我在网上找不到很多关于这个问题的东西。感谢你的提示。

  • 当我从注释中删除type=integer.class时,我开始在XML中得到maxOccurs=“unbounded”。 @XmlElement(required=true): 但我需要这种类型特别用于基元数据类型。如果注释中没有类型,则不需要的元素(即未设置required=true)缺少minOccurs=1。 有人能帮我吗?