jaxb 相关问题

用于XML绑定的Java体系结构是将XML用作域对象的Java标准。它提供了一种将Java类映射到XML表示的简单机制。

使用JAXB Marshaller

我有一个像以下内容一样的XML。 我有一个XML,如下所。 <Transactions> <FileHeader> <!--SOME VALUES--> </FileHeader> <BatchHeader> <!--SOME VALUES--> </BatchHeader> <Entry> <!--SOME VALUES--> </Entry> <Addenda> <!--SOME VALUES--> </Addenda> <Entry> <!--SOME VALUES--> </Entry> <Addenda> <!--SOME VALUES--> </Addenda> <BatchControl> <!--SOME VALUES--> </BatchControl> <BatchHeader> <!--SOME VALUES--> </BatchHeader> <Entry> <!--SOME VALUES--> </Entry> <Addenda> <!--SOME VALUES--> </Addenda> <BatchControl> <!--SOME VALUES--> </BatchControl> <FileControl> <!--SOME VALUES--> </FileControl> </Transactions> ESTERY,除了FileHeader和FileControl以外,所有都是列表。我正在使用JAXB解析XML,并具有以下定义的对象: @Getter @Setter @XmlRootElement(name = "Transactions") @XmlAccessorType(XmlAccessType.FIELD) public class Transactions { @XmlElement(name = "FileHeader") private FileHeader fileHeader; @XmlElement(name = "BatchHeader") private List<BatchHeader> batchHeaderList; @XmlElement(name = "Entry") private List<Entry> entryList; @XmlElement(name = "Addenda") private List<Addenda> addendaList; @XmlElement(name = "BatchControl") private List<BatchControl> batchControl; @XmlElement(name = "FileControl") private FileControl fileControl; } 现在,编组效果很好。保持标签的顺序是维护的,即在索引x处的batchheader与index的batchcontrol相对应。 但是,在编组所有批处理时,首先出现,然后是所有条目,然后是附录等。到目前为止,我对JAXB的经验,我知道这是逻辑上的行为,而不是我所需的行为。我希望XML以最初为batchheader 1的确切顺序,然后是batchheader 1,然后是batchcontrol 1,然后是batchheader 2等。 我尝试了x,但意识到这不是出于我的确切目的。我在互联网上抬起头来,但找不到太多。在线LLM型号无济于事。 jaxb是可能的吗?如果是这样,怎么样?目前,我采用了手动方法,将每个数据痛苦地添加到StringBuilder中,然后创建XML。 我尚未对此进行测试,但这是一个设计,将相关的四重奏(Addenda,batchcontrol,batchheader,entry)添加到@XmlType(propOrder={})元素中。 choice元素允许子元素的异质列表。 choice中的顺序无关紧要(对JaxB);但是,我相信JAXB将在揭露期间和在安排期间再次尊重元素的秩序。 transactions.xsd choice 用XJC生成Java类产生此集: XJC生成的类<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="Transactions"> <xs:complexType> <xs:sequence> <xs:element ref="FileHeader"/> <xs:choice maxOccurs="unbounded"> <xs:element ref="Addenda"/> <xs:element ref="BatchControl"/> <xs:element ref="BatchHeader"/> <xs:element ref="Entry"/> </xs:choice> <xs:element ref="FileControl"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="FileHeader"> <xs:complexType/> </xs:element> <xs:element name="Addenda"> <xs:complexType/> </xs:element> <xs:element name="BatchControl"> <xs:complexType/> </xs:element> <xs:element name="BatchHeader"> <xs:complexType/> </xs:element> <xs:element name="Entry"> <xs:complexType/> </xs:element> <xs:element name="FileControl"> <xs:complexType/> </xs:element> </xs:schema> 对于给出的简单XML示例,只有Addenda.java BatchControl.java BatchHeader.java Entry.java FileControl.java FileHeader.java ObjectFactory.java Transactions.java 类很有趣。它声明了Transactions,propOrder,fileHeader和addendaOrBatchControlOrBatchHeader将一般订购保持一致。 fileControl代表addendaOrBatchControlOrBatchHeader结构,并按顺序保存着四重奏的未划分元素。 主要收获是您需要以某种方式表达基数,以保留顺序,并且是一种选择。 transactions.javachoice

回答 1 投票 0

java.xml

回答 1 投票 0


在Javaee应用中注册Jackson Mixin

(在Javaee应用程序中使用Jackson作为Jaxb-Provider)的基础:

回答 1 投票 0

与Maven Generation的问题:HyperJaxB在Java JPA浮点阵列映射

I具有2D双数组属性,但是由于JPA不适用于数组,因此我有一个@xmljavatypepeadapter(doubleArrayAdapter.class),将我的数组存储在postgresql的字符串中... 我正在与JDK 21和

回答 1 投票 0

使用Jaxb

jaxb邮政为:

回答 2 投票 0



如何使用 jaxb 有条件地从 java dto 中提取几个字段?

考虑我有一个如下所示的订单 dto 类 公开课订单{ @XmlElement 受保护的长 ID; @XmlElement 受保护的字符串日期; @XmlElement 受保护的字符串集市; @XmlElement 受保护...

回答 1 投票 0

如何使用 JAXB 和 spring-boot 将 XML 转换为字符串?

当我在包含 pom.xml 文件的文件夹上运行 mvn spring-boot:run 时,应用程序会启动并将 POJO 正确序列化为 XML,但是当我通过转到目标文件夹并启动来执行此操作时... .

回答 2 投票 0

@JsonRootName 不能按我想要的方式工作

这是我的设施DTO @JsonRootName("设施") @XmlAccessorType(XmlAccessType.NONE) @XmlType(name = "设施", propOrder = { "id", "name", "totalQuantity" }) 公共类 FacilityDTO 实现

回答 1 投票 0

无法解析 jaxb-xjc-2.2.5-2.jar 中的名称“xjc:globalJavaType”

Maven项目,转移到另一台PC后出现错误。为什么? [信息] [jaxb2:生成{执行:default-cli}] [信息] ---------------------------------------------------------- ------------------------ [错误]

回答 5 投票 0

如何在扩展瞬态时排除“xs:type”标签

期望的结果: 轻松切换 .. .. 和 期望的结果: 轻松切换 <root> <child> <prop1>..</prop1> <prop2>..</prop2> </child> <root> 和 <root> <child> <prop1>..</prop1> <prop2>..</prop2> <prop3>..</prop3> <prop4>..</prop4> </child> </root> 我的代码 根.java @XmlRootElement(name= "root") public class Root { @XmlElement(name="child") public Child child } 扩展根.java @XmlRootElement(name= "root") public class ExtendedRoot extends Root { @XmlElement(name="child") public ExtendedChild child } Child.java @XmlTransient public class Child { // prop1, prop2 } 扩展子进程.java @XmlType(propOrder = {"prop1", "prop3","prop4", "prop2"}) public class ExtendedChild extends Child { // prop3, prop4 } 主要 System.setProperty("javax.xml.bind.context.factory", "org.eclipse.persistence.jaxb.JAXBContextFactory") Class clazz = extendChild ? ExtendedRoot.class : Root.class; JAXBContext jc = JAXBContext.newInstance(clazz); Marshaller marshaller = jc.createMarshaller(); marshaller.marshal(formattedJob, tempFile); 实际效果 <root> <child xs:type="ExtendedChild"> <prop1>..</prop1> <prop2>..</prop2> <prop3>..</prop3> <prop4>..</prop4> </child> </root> 如何从 xs:type=... 标签中排除此 child? 此处使用 xs:type 是因为 child 属性的值是多态的。如果没有它,JAXB 就没有机会决定在读取您自己的 XML 文档时使用哪个类。 JAXB 并不是那么聪明,首先要内省元素,然后选择最合适的类。 但是阅读时还有一些其他的要点: 您是否知道,ExtendedRoot 有两个名为 child 的属性(继承自 Root 的 super.child 和它自己的 this.child)?由于 ExtendedChild 是 Child,因此 ExtendedChild 也可以存储到以下两个属性之一: 首先,您可能想知道子元素出现在对象中的位置。 因为您可以将 ExtendedChild 存储到 Root.child,所以不需要 ExtendedRoot.child。如果没有这个,本例中甚至不需要 ExtendedRoot。 如果您坚持保留 ExtendedRoot,请注意,如果 JAXB 遇到 Root 元素,它无法决定是使用 ExtendedRoot 还是使用 root。

回答 1 投票 0

Jaxb2Marshaller:使用 0/1 来编组 xsd:boolean 值与生成的 java 模型

我正在使用 Jaxb2Marshaller 来编组和解组肥皂请求和响应。 我的java模型类是使用xjc基于wsdl生成的。 我有一个奇怪的要求,类型的字段...

回答 1 投票 0

在 gradle 任务中使用 XJC 的 JAXB2 基础插件

尝试使用 JAXB2 基础插件通过 toString 方法从 XSD 文件创建 bean,但收到错误“未知参数 -XtoString” 你好, 我想用

回答 1 投票 0

Jaxb 获取根据多个根元素 XSD 验证 XML 的根元素

我们有一个包含多个可能的根元素的 xsd。 要验证的 xml 可以采用其中任何一个,但显然每个 xml 一次。 我无法透露实际的 xsd,但让我们想象一下类似的东西: &l...

回答 1 投票 0

JAXB 生成无效的 Javadoc - @link byte[]

我正在使用 maven-jaxb2-plugin 从 WSDL 文件生成 JAXB 类。不幸的是,自动生成的 Javadoc 不符合 Java 8,因为它生成以下无效链接: /...

回答 2 投票 0

如何使用 JAXB 将 XML 文件的子部分解析为原始 XML,而不在标签中包含名称空间?

我的问题是我有一个此类的 .xml 文件需要解析: 项目.xml 我的问题是我有一个此类的 .xml 文件需要解析: item.xml <?xml version="1.0" encoding="UTF-8"?> <Item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com/item ../../item.xsd" xmlns="http://www.example.com/item"> <ID>1234</ID> <ItemDescription kind="long"> <p> <u>This is a description</u> </p> <br/> <p>End Of description</p> </ItemDescription> <ItemDescription kind="short"> <p> <u>This is a description</u> </p> </ItemDescription> </Item> 我希望文档的每个部分都映射到 java 类,除了 ItemDescription 下的内容。 ItemDescription 下的所有内容都应存储为字符串(包括标签),它应被视为原始 XML。 我尝试了几种方法,我的主要问题是 xml 的名称空间包含在标签“p”和“br”中,但我不希望这样。 我成功解决这个问题的唯一方法是使用正则表达式,但我想要一个没有添加它们的解决方案。 这是一个代码示例,它可以完成工作,同时仍然保留命名空间: Item.java package org.example; import org.apache.commons.collections4.CollectionUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import javax.xml.bind.annotation.*; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.StringWriter; import java.util.List; @XmlRootElement(name = "Item", namespace = "http://www.example.com/item") @XmlAccessorType(XmlAccessType.FIELD) public class Item { @XmlElement(name = "ID", namespace = "http://www.example.com/item") private String id; @XmlElement(name = "ItemDescription", namespace = "http://www.example.com/item") private List<ItemDescription> itemDescriptions; // Getters and Setters public String getId() { return id; } public void setId(String id) { this.id = id; } public List<ItemDescription> getItemDescriptions() { return itemDescriptions; } public void setItemDescriptions(List<ItemDescription> itemDescriptions) { this.itemDescriptions = itemDescriptions; } @XmlAccessorType(XmlAccessType.FIELD) public static class ItemDescription { @XmlAttribute(name = "kind") private String kind; // Store raw XML content as a String @XmlAnyElement(lax = true) private List<org.w3c.dom.Element> elements; // Getters and Setters public String getKind() { return kind; } public void setKind(String kind) { this.kind = kind; } public List<Element> getElements() { return elements; } public void setElements(List<Element> elements) { this.elements = elements; } public String getElementsAsString() { if (CollectionUtils.isEmpty(elements)) { return ""; } StringBuilder sb = new StringBuilder(); for (Object element : elements) { // Check if the element is an instance of a JAXB element that can be converted to XML if (element != null) { sb.append(element.toString()); } } return sb.toString(); } public String getContentAsString() { if (CollectionUtils.isEmpty(elements)) { return ""; } StringBuilder content = new StringBuilder(); for (Element element : elements) { // Create a new document to hold the element without namespaces DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(false); try { DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.newDocument(); Node importedNode = doc.importNode(element, true); doc.appendChild(importedNode); // Convert the document to a string TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); transformer.setOutputProperty(OutputKeys.INDENT, "no"); StringWriter writer = new StringWriter(); transformer.transform(new DOMSource(doc), new StreamResult(writer)); content.append(writer); } catch (Exception e) { e.printStackTrace(); } } return content.toString(); } } } ItemParser.java package org.example; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import java.io.InputStream; public class ItemParser { public void doParse(String resourcePath) throws JAXBException { // Initialize JAXB context JAXBContext context = JAXBContext.newInstance(Item.class); Unmarshaller unmarshaller = context.createUnmarshaller(); // Load XML from resources InputStream xmlStream = getClass().getClassLoader().getResourceAsStream(resourcePath); if (xmlStream == null) { throw new IllegalArgumentException("File not found: " + resourcePath); } // Parse XML into Item object Item item = (Item) unmarshaller.unmarshal(xmlStream); System.out.println("ID: " + item.getId()); // Print descriptions with raw XML content if (item.getItemDescriptions() != null) { for (Item.ItemDescription description : item.getItemDescriptions()) { System.out.println("Raw XML Content: " + description.getContentAsString()); } } } public static void main(String[] args) { try { new ItemParser().doParse("item.xml"); } catch (Exception e) { e.printStackTrace(); } } } pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>ItemParser</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-xjc</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> </dependency> </dependencies> <build> <sourceDirectory>src/main/java</sourceDirectory> <resources> <resource> <directory>src/main/resources</directory> </resource> </resources> </build> </project> ItemParser.java 中 main 的输出 ID: 1234 Raw XML Content: <p xmlns="http://www.example.com/item" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><u>This is a description</u> </p><br xmlns="http://www.example.com/item" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/><p xmlns="http://www.example.com/item" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">End Of description</p> Raw XML Content: <p xmlns="http://www.example.com/item" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><u>This is a description</u> </p> 如您所见,文档的命名空间已添加到标签中。 我尝试过的事情 正则表达式摆脱 xmlns 属性 -> 它可以工作,但不干净 使用 Transformer,但命名空间没有类似于 OutputKeys.OMIT_XML_DECLARATION 的属性。 使用 DOM API 使用 Element.removeAttribute 删除以“xmlns”开头的属性。删除属性效果很好,但是当使用转换器将元素序列化为字符串时,它们会被添加回来。我认为这是因为 Element 仍然有一个未通过 API 公开的字段“namespaceURI”。 与之前的项目符号点相同,但位于克隆元素上(以防万一克隆可能会错过名称空间,但不会) 我尝试在 ItemDescription 实体类中有一个 String 并有一个自定义适配器,但我没有成功。我认为如果实体类直接有一个 String 字段将原始 XML 映射为 String,这将是最好的解决方案 我明确表示我只想删除名称空间属性。如果原始文件有其他属性,我想保留它们。 您提到使用变压器。 我不确定这是否是您正在寻找的,但是......您可以通过在其位置创建一个使用其本地名称但没有名称空间的元素来从每个元素中删除名称空间: // Convert the document to a string TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer( new StreamSource(new StringReader(""" <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml"/> <xsl:template match="//*"> <xsl:element name="{local-name()}" namespace=""> <xsl:apply-templates/> </xsl:element> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> """)));

回答 1 投票 0

java.lang.ClassCastException:无法将 javax.xml.bind.JAXBElement 转换为

我正在使用 Spring boot 来调用 Web 服务。 我的配置类如下: @配置 公共类 ClientAppConfig { @豆 公共 Jaxb2Marshaller 编组器(){ Jaxb2Marshaller 编组器 = 新

回答 5 投票 0

如何使用 JAXB 编组器处理转义字符

我正在使用 JAXB Marshaller,并且我想转义字符。例如双引号 " 显示为 �。 这些该如何处理呢? 我正在通过其他类似的帖子来设置属性,但是我

回答 1 投票 0

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.