gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:05:08 25 4
gpt4 key购买 nike

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

问题:如何访问混合内容字符串值并将其保存在 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 后,我能够将所有内容转换为对象并保存为accorderling,除了实际的短语“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) 方法中。

最佳答案

我会试着用一个例子来回答你的问题:

input.xml

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

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

用例 #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;
}

}

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

关于JAXB-@XmlMixed 用于读取@XmlValue 和@XmlElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10940267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com