JAXB-@XmlMixed 用于读取@XmlValue 和@XmlElement

2024-04-03

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

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

标题.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 unmarshall 和 marshall 之后,我能够将所有内容转换为对象并保存 Accerling,除了实际的短语“Hello World.”。我知道我必须对这个复杂元素使用某种@XmlMixed,但我无法弄清楚。

我当前的output.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>

Desire output.xml:(与caption.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) 方法中。


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

输入.xml

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

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

Demo

以下代码将用于以对象形式读取 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;
    }

}

Output

输出与输入匹配。

<?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;
    }

}

Output

输出不再与输入匹配。

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

    Hello

    World

</root>

用例 #3 - 文本内容的字符串属性

由于文本节点可以在混合内容中多次出现,因此非 List 属性不太适合,并且看起来好像@XmlMixed注释被忽略。

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;
    }

}

Output

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <root/>
    <root/>
    <root/>
</root>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAXB-@XmlMixed 用于读取@XmlValue 和@XmlElement 的相关文章

随机推荐

  • isKindOfClass 行为

    有人可以解释为什么 isKindOfClass 根据实例的创建方式返回不同的结果吗 interface BaseClass interface DerivedClassA BaseClass DerivedClassA instance D
  • SQL - OR 条件的顺序重要吗?

    我必须选择符合的一行condition1 OR condition2 然而 condition1是优选的 如果有两行 第一行相交的位置condition1 并且不满足条件2 并且第二个满足condition2 并且不满足condition1
  • 如何使 HTML

    你知道如何制作一个 div 可以用 JavaScript 编辑吗 我正在寻找跨浏览器的解决方案 类似于富文本区域 但使用可编辑的 我需要类似的东西 div 我不想使用替换文本框 我知道怎么做了 您使用 DOMElement 的 conten
  • 无法将对象转换为 JSON

    早上好 当我尝试通过虚拟设备注册或登录时出现此错误 E StorageHelpers Failed to turn object into JSON java lang NullPointerException Attempt to inv
  • 使用 Apache POI 将列添加到 Excel

    我想知道如何使用 apache poi 在 xlsx 文件中添加新列 但我找不到任何东西 有什么办法可以做到这一点吗 或者是否有其他库可以解决这个问题 提前致谢 如果您的 Excel 文件包含已定义的现有行 则添加列的最快方法是在行上迭代一
  • Unity3D本地尺度问题

    下面的代码 Debug LogWarning updating scale fix scalefactor scaleFactor Current scale is cell transform localScale x cell tran
  • 运行时错误:CUDA 错误:设备端断言已触发 - 训练 LayoutLMV3 时

    我正在训练最新版本的layoutLMv3模型 但在开始训练时trainer train 出现以下错误 请帮我解决它 我使用的是 v100 4 GPU RuntimeError Traceback most recent call last
  • 选择所有选项值 php mysql

    我正在尝试从 MySQL 数据库中选择所有值 选项 a b 和 c 工作正常 但我不确定选择这三个选项的语法
  • 将复选框检查图像更改为自定义图像

    我正在尝试使用 CSS 更改复选框的默认 框图像 但它不起作用 有没有办法解决 class checkbox background url images button bullet normal png no repeat scroll 0
  • 在 iPhone 上管理 HTTP Cookie

    我想为 iPhone 移植一个使用 mechanize 的 python 应用程序 此应用程序需要登录网页并使用站点 cookie 转到该站点上的其他页面以获取一些数据 在我的 python 应用程序中 我使用 mechanize 进行自动
  • 为什么我可以在私有类型上使用 auto?

    我对以下代码的编译和运行感到惊讶 vc2012 gcc4 7 2 class Foo struct Bar int i public Bar Baz return Bar int main Foo f Foo Bar b f Baz err
  • 如何使用张量流服务使张量流集线器嵌入可服务?

    我正在尝试使用来自tensorflow hub的嵌入模块作为可服务 我是张量流新手 目前 我正在使用通用句子编码器 https tfhub dev google universal sentence encoder 1嵌入作为将句子转换为嵌
  • 单元测试模拟 - Node 17 + Typescript + ESM 模块

    有一个简单的问题我找不到答案 使用时 节点 17 打字稿 ESM package json 中的 类型 模块 我可以实现模拟吗仅用于一种功能 或模块 如果是这样 我可以举个例子吗 无论你使用什么框架 thanks 包 json test n
  • 如何暂时禁用 C/C++ 中的宏扩展?

    由于某种原因 我需要暂时禁用头文件和 undef MACRONAME将使代码编译 但它将在现有宏下进行 有没有办法禁用它 我应该提到 您并不真正知道宏的值 并且我正在寻找交叉编译器解决方案 至少应该在 GCC 和 MSVC 中工作 在 MS
  • PHP 中的缓存变量

    长话短说 我正在寻找快速有效地存储布尔变量的最佳方法 例如 当前用户是否浏览过此页面 布尔值 当前用户是否已为此页面投票 再次布尔 今天该用户有多少次通过投票获得积分 整数 这些变量将仅存储一天 即每天午夜它们将被删除 我可以想到五种方法来
  • SparkContext.getOrCreate() 用途

    目的是什么getOrCreate方法来自SparkContext班级 我不明白什么时候应该使用这个方法 如果我有 2 个 Spark 应用程序运行spark submit 在主要方法中 我用以下方法实例化 Spark 上下文SparkCon
  • 检查应用程序的互联网连接

    我需要检查用户是否已连接到互联网 然后才能继续 我使用 HttpClient 访问端点 如下所示 client http Client req http NewRequest GET url nil req SetBasicAuth use
  • Android 允许将多个文件上传(最大 150 MB)到 PHP 服务器

    我必须允许用户在从我的 Android 应用程序到 PHP 服务器的单个请求中上传多个文件 可以是图像 视频 音频 我正在使用 REST 网络服务 对于此功能 我使用以下代码 To upload the multiple documents
  • 没有为 Protobuf-net 中的 System.Management.Automation.PSObject 类型定义序列化程序

    这是我的课 ProtoContract internal class Powershellresults internal Powershellresults ProtoMember 1 public Collection
  • JAXB-@XmlMixed 用于读取@XmlValue 和@XmlElement

    我在这里看到了类似的问题 但它并没有帮助我解决问题 所以我在这里发布我的问题 看看是否有人可以修改我的代码以使其工作 问题 如何访问混合内容字符串值并将其保存在 setPhrase String value 方法中 标题 xml