可扩展标记语言(XML)是一种灵活的结构化文档格式,用于定义人类和机器可读的编码规则。
如何使用 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> """)));
如果子元素 fiel1 和 field2 都不存在或为空,我需要删除 xml 元素。 输入和预期结果(见评论) <...
我正在尝试在 log4j2.xml 文件中创建条件语句,但它似乎不接受任何条件格式。我尝试过各种选项,例如 xslt 等,但似乎没有......
XSLT 3.0 分组依据 <xsl:function as="xs:boolean">:如何将结果映射到有意义的文本属性以进行输出
我想在 XSLT 3.0 中使用我自己的 作为分组键。我的函数返回 xs:boolean 但在分组的输出中我想将 true 和 false 映射到有意义的字符串值,我...
我有一个日期选择器: 我有一个日期选择器: <DatePicker android:datePickerMode="spinner" android:calendarViewShown="false" android:id="@+id/datePicker" android:layout_width="300dp" android:layout_height="wrap_content" android:layout_centerInParent="true" /> 它看起来像这样: 我得到的结果 我正在尝试使后两个和前两个日期可见。 它应该看起来像这样: 想要的结果 我很早之前就想达到同样的效果,当时就用了这个WheelView。 有一个属性itemVisibleNum符合要求。
是否可以在 Netflix 上提供始终更新的正在播放的电视剧列表? 我想获取一个公共 URL,我可以访问该 URL 以接收诸如包含列表的 JSON o XML 对象之类的内容? 我不知道...
当我单击按钮时,我应该看到一个列表。还应该有创造新记录的能力。但是当我点击按钮时我得到: 找不到类型“form”的默认视图! 怎么...
大家好,问候, 我需要帮助,按我的 XML 对象类进行分组。 这是我来自 SQL Server 的数据,我的查询 (从 TaxXMLdb 选择 *)= 锡 文档入口AR 买家文件编号 买家姓名 选择 项目代码 姓名
代码运行良好,但现在不起作用,即使是相同的代码。我添加并更改了其他文件的代码以使用chaquopy。我收到有关标签的错误。 我删除了与ve相关的代码...
在这个问题之后,我想根据预处理器指令在构建时有条件地包含/排除 XAML 元素,类似于 #if/#else 在 C# 中的工作方式。我尝试过使用 XSLT 来转换...
我有一个表,其中包含 XML 列 XmlMsg。此列可以包含订单状态、车辆状态、... 我只对 orderstatus 节点感兴趣,更确切地说对以下两种情况感兴趣: 那个...
我正在将java对象序列化为XML,稍后需要通过xslt转换该xml。 在这个特定的转换中,我需要删除一个名为 fieldToDelete 的节点(= Java 字段),它可以包含一个
总结 比利时国家银行 (NBB) 通过其 API 向公众提供上市公司的财务报表。自 2022 年起,这些可以以 JSON 文件形式请求。之前只在X...
根据 XSD 验证 XML 时出现问题 - PHP/schemaValidate
我正在尝试使用 DOMDocument 中的函数 schemaValidate(String file) 根据 XSD 验证 XML 文件。 当我在其他工具(例如在线验证器)上验证它时,它工作正常,但在我的
我有一个表,其中包含 XML 列 XmlMsg。此 XmlMsg 可以包含“orderstatus”、“vehiclestatus”... 我只对“订单状态”感兴趣,更确切地说......
我正在尝试在 Vapor 中使用 XML 正文解码请求。 请求内容为: 我正在尝试在 Vapor 中使用 XML 正文解码请求。 请求内容为: <?xml version='1.0' encoding='UTF-8'?> <feed xmlns:yt="http://www.youtube.com/xml/schemas/2015" xmlns="http://www.w3.org/2005/Atom"><link rel="hub" href="https://pubsubhubbub.appspot.com"/><link rel="self" href="https://www.youtube.com/xml/feeds/videos.xml?channel_id=REDACTED"/><title>YouTube video feed</title><updated>2024-11-27T15:08:44.561926689+00:00</updated><entry> <id>yt:video:REDACTED</id> <yt:videoId>REDACTED</yt:videoId> <yt:channelId>REDACTED</yt:channelId> <title>Test Video</title> <link rel="alternate" href="https://www.youtube.com/watch?v=REDACTED"/> <author> <name>Test User</name> <uri>https://www.youtube.com/channel/REDACTED</uri> </author> <published>2024-11-27T15:08:41+00:00</published> <updated>2024-11-27T15:08:44.561926689+00:00</updated> </entry></feed> 我正在尝试将其解码为以下模型: struct PubSub: Content { struct Feed: Codable { struct Entry: Codable { let id: String } let entry: Entry } let feed: Feed } 使用以下代码进行解码: guard let pubSub = try? req.content.decode(PubSub.self, as: .xml) else { throw Abort(.badGateway) } return pubSub 由于某种原因,它永远无法成功解码。有人可以分享 Vapor 解码 XML 的正确方法吗? Vapor 没有内置的 XML 解码器,因此您需要找到一个适合您的解码器。一旦您拥有了它,您就可以将其符合 ContentDecoder 并按照文档进行注册
我目前正在我的 Android 工作室上从事该项目,并成功构建了一个稳定的移动应用程序和可穿戴设备,它将从移动应用程序同步实时数据。然而,我很难尝试...