gpt4 book ai didi

java - 如何在 Spring Boot 中忽略可选的 xsd 属性和列表标记

转载 作者:太空宇宙 更新时间:2023-11-04 11:01:33 24 4
gpt4 key购买 nike

我有一个 xsd,如下(无法更改 xsd):

<xsd:element name="root">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="element1"/>
<xsd:element ref="element2" minOccurs="1" maxOccurs="unbounded"/>
<xsd:element ref="element3"/>
</xsd:sequence>
<xsd:attribute name="lang" type="xsd:string" use="optional"/>
</xsd:complexType>
</xsd:element>

<xsd:element name="element2">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="childElement1"/>
<xsd:element ref="childElement2"/>
</xsd:sequence>
<xsd:attribute name="lang" type="xsd:string" use="optional"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="element1">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="lang" type="xsd:string" use="optional"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="element3">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="lang" type="xsd:string" use="optional"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>

...等等..生成的类如下:

@XmlRootElement(name = "Element1")
public class Element1{

@XmlValue
protected String value;
@XmlAttribute(name = "lang")
protected String lang;
}

其余类类似。

最终的 xml 看起来像这样:

<root>
<Element1>
<value>1</value>
<lang/>
</Element1>
<Element2>
<Element2>
<ChildElement1>
<value>2a</value>
<lang/>
</ChildElement1>
<ChildElement2>
<value>2b</value>
<lang/>
</ChildElement2>
</Element2>
</Element2>
<Element3>
<value>3</value>
<lang>Eng</lang>
</Element3>
<lang/>

但是,我想要以下内容:

  1. 当 lang 标签(可选 xml 属性)没有值时,不应出现在 xml 中。此外,当它们有值(value)时,它们应该位于父标签内。并且该值也应该填充在父元素标签内,而不是独立的值标签内。
  2. element2的列表只有1个元素时,不应该有2个标签。

    类似这样的事情:

    <root>
    <Element1>1</Element1>
    <Element2>
    <ChildElement1>2a</ChildElement1>
    <ChildElement2>2b</ChildElement2>
    </Element2>
    <Element3 lang="Eng">3</Element3>

    有什么办法可以达到这个目的吗?

这基本上是休息操作的响应。我使用的是 Spring Boot,因此我没有明确使用 JaxB 编码和解码。

编辑:忘记提及我的 pom 中有 jackson-xml-formatter 依赖项(以及 woodstox)。

最后,对于这篇包含大量代码片段的长帖子表示抱歉。不知道如何描述我的问题。

最佳答案

这里有一个自给自足的文件来实现这一点。基本上所有元素都有一个根。我只是快速写下来给你一个想法。您可以根据需要更改方法名称、类名称。

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Element1")
public class Element1 {

@XmlValue
protected String value;
@XmlAttribute(name = "lang")
protected String lang;

public String getValue() {
return value;
}

public void setValue(String value) {
this.value = value;
}

public String getLang() {
return lang;
}

public void setLang(String lang) {
this.lang = lang;
}

public static void main(String[] args) throws Exception {

Root r = new Root();
Element1 e1 = new Element1();
e1.setValue("1");
Element2 e2 = new Element2();
Element1 ce1 = new Element1();
ce1.setValue("2a");
e2.setChildElement1(ce1);
Element1 ce2 = new Element1();
ce2.setValue("2b");
e2.setChildElement2(ce2);
r.setElement2(e2);
r.setElement(e1);
Element1 e3 = new Element1();
e3.setValue("3");
e3.setLang("eng");
r.setElement3(e3);
JAXBContext jc = JAXBContext.newInstance(Root.class);
Marshaller marrshaller = jc.createMarshaller();
marrshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

marrshaller.marshal(r, System.out);
}
}

@XmlRootElement(name = "root")
@XmlAccessorType(XmlAccessType.FIELD)
class Root {

@XmlElement(name = "Element1")
Element1 element;

@XmlElement(name = "Element2")
protected Element2 element2;

public Element2 getElement2() {
return element2;
}

public void setElement2(Element2 element2) {
this.element2 = element2;
}

@XmlElement(name = "Element3")
Element1 element3;

public Element1 getElement3() {
return element3;
}

public void setElement3(Element1 element3) {
this.element3 = element3;
}

public Element1 getElement() {
return element;
}

public void setElement(Element1 element) {
this.element = element;
}
}

@XmlRootElement(name = "Element2")
@XmlAccessorType(XmlAccessType.FIELD)
class Element2 {

public Element1 getChildElement1() {
return childElement1;
}

public void setChildElement1(Element1 childElement1) {
this.childElement1 = childElement1;
}

public Element1 getChildElement2() {
return childElement2;
}

public void setChildElement2(Element1 childElement2) {
this.childElement2 = childElement2;
}

@XmlElement(name = "ChildElement1")
Element1 childElement1;

@XmlElement(name = "ChildElement2")
Element1 childElement2;
}

关于java - 如何在 Spring Boot 中忽略可选的 xsd 属性和列表标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46848345/

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