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

JAXB-@Xml混合读取@XmlValue和@XmlElement的用法

储思聪
2023-03-14

我在这里看到了一个类似的问题,但它并没有帮助我解决这个问题,所以我在这里发布我的问题,看看是否有人可以修改我的代码使其工作。

问:如何访问混合内容字符串值并将其保存在 setPhrase(字符串值)方法中?

标题.xml:

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="link1" xmlns:prefix2="link2" prefix1:att1="att1">
    <head>
        <styling>
            <style prefix1:att1="att1" prefix2:att2="att2" prefix2:att3="att3" prefix2:att4="att4" />
        </styling>
        <layout />
    </head>
    <body xmlns:prefix3="link3">
        <div prefix1:att1="att1" prefix1:att2="att2">
            <prefix3:info att1="att1" att2="att2" />
            <p att1="att1" att2="att2" att3="att3">
                <prefix3:status att1="att1" att2="att2" />
                Hello World.
            </p>
        </div>
    </body>
</tt>

标题.java:

package com;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlElementRefs;
import javax.xml.bind.annotation.XmlMixed;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "p")
@XmlType(propOrder = { "att1", "att2", "att3", "phrase", "subelement"})
public class Caption {
    private String  att1;
    private String  att2;
    private String  att3;
    private String  phrase;
    private Subelement subelement = new Subelement();

   @XmlMixed
   public void setPhrase(String value)
   {
      this.phrase = value;
   }
   public String getPhrase()
   {
      return phrase;
   }

   @XmlElementRefs({@XmlElementRef(name = "subelement", type = Subelement.class)})
   @XmlMixed
   public void setSubelement(Subelement subelement )
   {
      this.subelement = subelement;
   }
   public Subelement getSubelement()
   {
      return subelement;
   }

   @XmlAttribute
   public void setAtt1( String att1 )
   {
      this.att1 = att1;
   }
   public String getAtt1()
   {
      return att1;
   }

   @XmlAttribute
   public void setAtt2( String att2 )
   {
      this.att2 = att2;
   }
   public String getAtt2()
   {
      return att2;
   }

   @XmlAttribute
   public void setAtt3( String att3 )
   {
      this.att3 = att3;
   }
   public String getAtt3()
   {
      return att3;
   }
}

在使用JAXB解组和编组之后,我能够将所有内容转换为和对象并保存为相应的内容,但实际短语“Hello World”除外。我知道我必须为这个复杂的元素使用某种@XmlMixed,但我无法理解。

我目前的输出.xml:

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="link1" xmlns:prefix2="link2" prefix1:att1="att1">
    <head>
        <styling>
            <style prefix1:att1="att1" prefix2:att2="att2" prefix2:att3="att3" prefix2:att4="att4" />
        </styling>
        <layout />
    </head>
    <body xmlns:prefix3="link3">
        <div prefix1:att1="att1" prefix1:att2="att2">
            <prefix3:info att1="att1" att2="att2" />
            <p att1="att1" att2="att2" att3="att3">
                <prefix3:status att1="att1" att2="att2" />
            </p>
        </div>
    </body>
</tt>

期望输出.xml:(与字幕.xml相同)

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="link1" xmlns:prefix2="link2" prefix1:att1="att1">
    <head>
        <styling>
            <style prefix1:att1="att1" prefix2:att2="att2" prefix2:att3="att3" prefix2:att4="att4" />
        </styling>
        <layout />
    </head>
    <body xmlns:prefix3="link3">
        <div prefix1:att1="att1" prefix1:att2="att2">
            <prefix3:info att1="att1" att2="att2" />
            <p att1="att1" att2="att2" att3="att3">
                <prefix3:status att1="att1" att2="att2" />
                Hello World.
            </p>
        </div>
    </body>
</tt>

感谢您的帮助,我可以访问这个值并将其保存在setPhrase(String value)方法中。

共有1个答案

毛缪文
2023-03-14

我将尝试用一个例子来回答你的问题:

输入. xml

对于此示例,我们将使用以下 XML 文档。元素具有混合内容。具有混合内容意味着文本节点可以与元素混合出现。由于可以出现多个文本节点,因此一元属性不适合。

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <root/>
    Hello
    <root/>
    World
    <root/>
</root>

演示

下面的代码将用于读入XML到对象的形式,然后将其写回XML。

package forum10940267;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum10940267/input.xml");
        Root root = (Root) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}

用例 #1 - 一个列表用于保存混合内容

@XmlMixed最常用于另一个批注,以便生成的 List 同时包含元素和文本内容。这样做的一个优点是保持了顺序,以便文档可以被随机跳闸。

package forum10940267;

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Root {

    private List<Object> mixedContent = new ArrayList<Object>();

    @XmlElementRef(name="root", type=Root.class)
    @XmlMixed
    public List<Object> getMixedContent() {
        return mixedContent;
    }

    public void setMixedContent(List<Object> mixedContent) {
        this.mixedContent = mixedContent;
    }

}

输出

输出与输入相匹配。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <root/>
    Hello
    <root/>
    World
    <root/>
</root>

用例2——混合内容的单独列表

您还可以为文本内容引入单独的列表属性。

package forum10940267;

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Root {

    private List<Object> mixedContent = new ArrayList<Object>();
    private List<String> text;

    @XmlElementRef(name="root", type=Root.class)
    public List<Object> getMixedContent() {
        return mixedContent;
    }

    public void setMixedContent(List<Object> mixedContent) {
        this.mixedContent = mixedContent;
    }

    @XmlMixed
    public List<String> getText() {
        return text;
    }

    public void setText(List<String> text) {
        this.text = text;
    }

}

输出

输出不再与输入匹配。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <root/>
    <root/>
    <root/>

    Hello

    World

</root>

USE CASE#3-文本内容的字符串属性

由于文本节点可以在混合内容中多次出现,因此非List属性不太合适,并且似乎忽略了@XmlMiux注释。

package forum10940267;

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Root {

    private List<Object> mixedContent = new ArrayList<Object>();
    private String text;

    @XmlElementRef(name="root", type=Root.class)
    public List<Object> getMixedContent() {
        return mixedContent;
    }

    public void setMixedContent(List<Object> mixedContent) {
        this.mixedContent = mixedContent;
    }

    @XmlMixed
    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

}

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <root/>
    <root/>
    <root/>
</root>
 类似资料:
  • 我正在尝试创建一个可以同时包含元素和值的java/jaxb类。 我想在A类的列表中读取一个类的属性,并作为A类本身的值输出。 这是XML: 我必须阅读: 并生产: 这是我的错误类-工作正常: 我的设备类别: Jaxb 抱怨我不能在同一类中同时拥有 xml 元素(错误 )和 xml 值 如何正确建模/注释此内容,以允许我读取 error xml 标记的属性并将其生成为设备标记的值?

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

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

  • 继JAXB和复合模式之后,我设法映射: 但我想绘制: 我的JAXB类层次结构如下: 有几种类型的查询: 复合词(和/或)非常相似: 和封闭bean: JAXB不允许我只在上映射。为什么以及有什么替代方案?

  • 是否有可能有一个使用值 AND 元素呈现的 JAXB 元素? 我正在尝试渲染类似下面的内容: 它甚至可能不是有效的XML,但不幸的是,我试图渲染的东西需要它,而不是可选的。 如果有一个值和元素,则会给出一个。

  • 我有下一个html,我想解析它: 我有下一节课: 和: 现在,我还需要跨度的值(“bla-bla”)。因此,我将添加到类中: 位它给了我下一个错误: 我尝试使用@XMLMixed,但是没有成功。我会很高兴,例如代码的例子。谢了。