问题标签 [woodstox]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
335 浏览

java - 如何将两个 XML 文件合并/合并为一个并决定是否添加/删除元素或属性

我需要比较两个 xml 文件并合并为一个。如果元素或属性不同,我想决定是否要添加或删除此数据。我使用 StaX 来读写文档。现在我只需要从第二个 xml 文件中添加元素,但是当我比较 xml 文件之间的数据时,光标位置有问题。如果您知道这个问题的解决方案,我将非常感激。

例如第一个控件 XML:

第二个测试

结果

0 投票
2 回答
1532 浏览

java - 将 JSON 转换为 XML XmlMapper- Jackson 2.10

我有 @JsonProperties 的 pojos。我使用这些来读取 JSON 并解析为 POJO。我现在必须发布这些格式为 XML 的 pojo。

成功发布所需的 XML 格式如下所示(注意命名空间类型、xsi 类型格式):

我通过创建的应用程序类(如下所示)转换为 XML

输出有点偏离,不包含 xmlns,xsi 看起来不同。它还具有“应用程序”作为根:

当我将类输出到 JSON 时,它看起来像预期的那样(没有“应用程序”作为根)。

为了正确格式化 XML,我需要使用 XmlMapper() 或 POJO 进行什么修改?

以下是用于此的 POJO。

应用类:

网络对象类:

网络对象类:

0 投票
0 回答
2131 浏览

jackson - 如何使用 Jackson XmlMapper() 指定命名空间

我有一个需要解析为 XML 的 POJO。我正在使用杰克逊 2.10。

我传递我的对象并解析如下:

我的输出有 xmlns:wstxnsl。我希望它是 xmlns:xsi 后跟 xsi:type""。

我相信这是因为默认使用woodstox。我需要改变它。

我需要做什么才能让杰克逊发生这种情况?

期望的输出:

实际输出

0 投票
1 回答
45 浏览

java - 我需要将 XML 文件转换为 CSV,但只能读取一次文件,并且记录标签中的标题可能会改变,有什么想法吗?

我有一些非常大的 XML 文件,我需要对其进行解析并将相关数据提取到 csv 文件中,本质上是对 XML 文档执行部分展平。XML 文件将具有存储所有记录的“记录标记”。它看起来很像这样,例如:

这里的记录标签是“人”,转换为 CSV 的结果如下所示:

这可能是不正确的——我很快就输入了它——但你明白了。

有一些限制要记住:

  1. 该文件非常大 - 1GB+ - 所以我无法将它加载到内存中。
  2. 我应该只读一次。
  3. (显然)数据不能丢失或不正确。

好的,所以我目前有一个解析器,它将一个简单的 XML 文件转换为一个给定“ROWTAG”的 csv,这是其中包含记录的标签(person在本例中)。你可以在这里看到它。

但它有一些限制。我知道如何修复/解决其中的大多数问题,但是如果不打破约束,我无法弄清楚其中的两个问题。

  1. 根据解析器的实现方式,标签的顺序很重要。假设我有一个如下所示的 xml 文件:

第一个记录标签中的中间名排在第二位,第二个记录中的中间名排在第三位。这将产生一个如下所示的 CSV 文件:

迈克尔的名字被记录为迈克尔乔丹罗斯,当时应该是迈克尔罗斯乔丹。

  1. 如果添加、删除或更改属性,程序不会反映这一点。这是因为程序只查看第一个记录元素中的标签,而不关心下一个元素中的标签(如示例一所示)。

让我们举这个例子:

生成的 CSV 如下所示:

这当然是个大问题,必须解决。

我的解决方案

在找到解决方案之前,我将快速总结一下该程序的工作原理。解析器在 XML 文档中移动,每次遇到标记时,都会将其返回给我的程序。正如我所解释的,我的程序有一个“rowTag”,程序正在寻找它。一旦遇到它,我的程序就会开始查看这个 rowTag 中的所有标签和值,并将它们保存在 StringBuilder 中。当遇到结束 rowTag 时,它将转储该信息。在第一次迭代期间,它还将保存它遇到的所有标头,然后在到达结束标记后转储记录的值之前,它将首先转储标头。

现在......正如我所提到的,这会在保存订单以及任何更改、删除或添加的标签方面产生问题。我有一个解决订单的解决方案,它应该解决未更新的标头问题,但我不确定它是否适用于我的用例(我将在一分钟内解释原因)。

我的想法是有一个类似 hashmap 的东西,它收集标签的值以及它们随着时间的推移遇到的顺序。键是标签的值,值是标签第一次出现的顺序。

当我们在程序中移动时收集记录时,我们会将它们放在一个与哈希图一样大的数组中,并放在它需要的正确位置。如果我们遇到新标签,我们将简单地调整数组的大小并将标签添加到哈希图中,而不是它当前遇到的顺序的值(因为这可能会覆盖某些东西),而是前一个元素的值 + 1 (这将是一个有序的哈希图,所以我会知道前一个元素是什么)。

一旦我们完全完成了程序,我们会将收集到的标题转储到文件的第一行。

所以,让我们看第一个例子:

第一次运行后的 hashmap 如下所示:

{firstname: 0, middlename: 1, lastname: 2}

当我们到达第二条记录时,中间名和姓氏的位置被交换,我们将简单地将姓氏放在该array[2]位置,并将中间名放在该array[1]位置。

如果我们遗漏了一些东西,例如这样的:

在第二次运行期间,该数组在第二个值中将为空(因为中间名不存在),我们只需将其转换为空字符串,并像往常一样在此处附加一个逗号。

有趣的部分是添加某些内容时:

这将生成如下所示的 CSV:

,第一列在之后没有额外的Smith内容,但似乎即使这不是有效的 CSV 也可以吗?凉爽的。

无论如何-我认为现在真正的问题来了。我实际上并没有在 java 中使用 bufferedreader/bufferedwriter。我们正在使用 Azure 附带的流读取器/写入器,因为当然所有这些文件都在云上,并且在底层它基本上只是休息 api 调用。所以我认为我不能将标题转储到文件的第一行。无论如何,我什至不确定这是否可能。

所以。有哪位大神有想法吗?

0 投票
1 回答
74 浏览

stax - Woodstox - 当文档没有根时尝试写入 END_DOCUMENT

这是我第一次使用 Woodstox 编写 XML,当我添加 EndDocument 时出现错误。

我的代码:

错误:

XML 是这样写的:

我试图禁用验证,将属性 P_OUTPUT_VALIDATE_STRUCTURE、P_OUTPUT_VALIDATE_CONTENT、P_OUTPUT_VALIDATE_NAMES、P_OUTPUT_VALIDATE_ATTR、P_OUTPUT_FIX_CONTENT 设置为 false,但出现此错误:

禁用 P_AUTOMATIC_END_ELEMENTS,我得到第一个错误。

我究竟做错了什么?

0 投票
1 回答
20 浏览

java - 如何将 XSD 用于非命名空间的文档

最近我遇到了一个以 XML 格式返回结果的服务,其方式如下

请注意,该文档没有命名空间定义。结果,没有我可以使用的“官方”模式。

我已经编写了一个模式定义,我可以使用它来生成可在代码中使用的类,以与文档中的等效元素进行交互。从观察中我可以看出文档格式没有改变(字段顺序保持不变,字段没有引入或消失)。但问题是,我仍然可以使用我的模式反序列化提供的文档吗?据我所知,schema必须定义一个命名空间,理论上是上面和下面的文档

不等价。

作为参考,我使用 stax 和 woodstox 6 作为实现。

0 投票
1 回答
110 浏览

java - 如何将列表中的 XML 元素添加到 XMLEventWriter 中?将 XML 附加到已创建的 XMLEventWriter/XmlStreamWriter

我有一个List<String>包含XML作为方法输出的一部分创建的事件JAXB Marshaling。完成该JAXB Marshaling过程后,这List<String>可能包含大量 XML。

这些XML片段因此是大型 XML 的一部分。大型 XML 有一些额外的标头元素,所以我试图创建large XML使用XMLEventWriter并尝试添加我的元素,LIST<String>但它没有按预期工作并遇到各种错误。

我收到以下错误:

以下是我的代码:

以下是我期待的输出:

我调查了一下XMLStreamWriter,但我知道使用它无法做到这一点。我并不特别在意XMLEventWriter。我想要的只是使用任何方法/库获得所需的输出。

有人可以帮我吗?我只想添加已经用几个节点创建的XMLfrom my Listto 。XMLEventWriter

0 投票
1 回答
97 浏览

java - 使用公理进行 DTD 解析

我正在尝试将 axiom 1.2.22 与 woodstox 6.2.6 一起使用来解析具有 doctype 的 XML 文档。(我使用的是 OpenJDK 11,但这不应该有任何区别。)我遇到了How to ignore DTD parsing in Apache's AXIOM中提到的相同错误:

根据https://issues.apache.org/jira/browse/AXIOM-475应该用 axiom 1.2.16 修复,但似乎该错误又回来了。

示例片段:

我使用的是不兼容的版本吗?我也尝试使用woodstox 5.0.0,它会抛出同样的错误。我还验证了在使用 XMLInputFactory.newFactory() 时它实际上是woodstox XMLInputFactory。这些是我使用的 maven 依赖项(我省略了一些与日志记录和重复类相关的排除项):

更新:看起来很像公理代码试图从配置属性中确定要使用的 DTDReader 类。不幸的是,将 XMLInputFactory 中的属性 DTDReader.PROPERTY 设置为任何值都会导致以下堆栈跟踪:

0 投票
1 回答
31 浏览

java - Woodstox/XML1.1/XSD 解析+验证和 XInclude

请在下面帮助我处理我的 Java/woodstox 代码。我还在示例中提供了一个 xsd 和两个 xml 文件。

主要问题

我打开了验证,预计会出现验证错误,因为

  • ID foo1 和 foo2 在 test2.xml 中定义了两次,
  • ID foo 在 test2.xml 中没有定义使用(除非考虑到来自 test1.xml 的 ID,因为我希望它使用 XInclude 发生),并且
  • ID foo3 在 test2.xml 中没有定义。但是,没有显示验证问题。

测试.xsd

test1.xsd

test2.xsd

Java 代码

我尝试过的

我应该更好地使用 SAXParserFactory saxParserFactory = WstxSAXParserFactory.newInstance(); 而不是 XMLInputFactory xmlInputFactory = XMLInputFactory2.newInstance(); 作为第一步吗?有什么区别?

但是,在设置“不支持指定的模式语言”时saxParser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage","http://www.w3.org/2007/XMLSchema-versioning"); ,我遇到了问题 。SAXNotSupportedException结果。

至少我可以在那里 xmlReader.setErrorHandler(new SimpleErrorHandler()); 安装一个错误处理程序,我在上面的代码中没有这样做。

插件问题1

什么对我更好:createXMLStreamReadercreateXMLEventReader

插件问题2

我需要调整我的 XSD/XML 文件吗?尤其是标题?

插件问题3

我需要在解析/验证之前解决 Xincludes 吗?如果是这样,怎么做?

进一步的背景

  • 显然,代码处于早期阶段,我不太关心它是如何结束的。
  • 我使用 XML1.1 因为我需要具有多个 ID 属性的 xml-tags。
  • 我使用 XInclude 是因为我想以模块化方式定义我的 xml 文件以避免 xml 代码重复。
  • Intellij 不验证我的文件,所以我特此尝试更深入地挖掘,但我认为这些问题到目前为止是不相关的,因为在这里我没有遇到验证问题,而我在另一个线程中遇到了一个问题
  • 我将(几乎相同的问题)发布到 Woodstox 邮件列表,但几乎没有任何活动。线
0 投票
0 回答
297 浏览

java - XMLEventWriter 抛出 javax.xml.stream.XMLStreamException: No open start element,当尝试写入结束元素时,即使打开

我有一个应用程序JSON -> XML转换器。这个应用程序将接受一个List被一个一个地转换为 XML 的事件。在转换之前,将使用该start方法创建最终 XML 的标头,然后将转换后的事件xmlEventWriter一一添加,最后在所有转换后将结束标记添加到 XML usingend方法。

我在关闭标签并遇到错误时遇到问题:

根据我的理解,一切都是正确的,但仍然面临不知道为什么的问题。

以下是将header body and closure在 XML 中创建标签的类:

我收到此行的错误:

我不确定为什么会收到此错误。我正在打开Body标签,然后尝试关闭它。我确信流程是正确的,我正在调用start, collect,然后是 finally end。继output我得到:

END END由于closing of Body标签出现错误,我没有收到。有人可以帮我理解这个问题并提供一些解决方法和帮助。