问题标签 [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.
java - 如何将两个 XML 文件合并/合并为一个并决定是否添加/删除元素或属性
我需要比较两个 xml 文件并合并为一个。如果元素或属性不同,我想决定是否要添加或删除此数据。我使用 StaX 来读写文档。现在我只需要从第二个 xml 文件中添加元素,但是当我比较 xml 文件之间的数据时,光标位置有问题。如果您知道这个问题的解决方案,我将非常感激。
例如第一个控件 XML:
第二个测试
结果
java - 将 JSON 转换为 XML XmlMapper- Jackson 2.10
我有 @JsonProperties 的 pojos。我使用这些来读取 JSON 并解析为 POJO。我现在必须发布这些格式为 XML 的 pojo。
成功发布所需的 XML 格式如下所示(注意命名空间类型、xsi 类型格式):
我通过创建的应用程序类(如下所示)转换为 XML
输出有点偏离,不包含 xmlns,xsi 看起来不同。它还具有“应用程序”作为根:
当我将类输出到 JSON 时,它看起来像预期的那样(没有“应用程序”作为根)。
为了正确格式化 XML,我需要使用 XmlMapper() 或 POJO 进行什么修改?
以下是用于此的 POJO。
应用类:
网络对象类:
网络对象类:
jackson - 如何使用 Jackson XmlMapper() 指定命名空间
我有一个需要解析为 XML 的 POJO。我正在使用杰克逊 2.10。
我传递我的对象并解析如下:
我的输出有 xmlns:wstxnsl。我希望它是 xmlns:xsi 后跟 xsi:type""。
我相信这是因为默认使用woodstox。我需要改变它。
我需要做什么才能让杰克逊发生这种情况?
期望的输出:
实际输出
java - 我需要将 XML 文件转换为 CSV,但只能读取一次文件,并且记录标签中的标题可能会改变,有什么想法吗?
我有一些非常大的 XML 文件,我需要对其进行解析并将相关数据提取到 csv 文件中,本质上是对 XML 文档执行部分展平。XML 文件将具有存储所有记录的“记录标记”。它看起来很像这样,例如:
这里的记录标签是“人”,转换为 CSV 的结果如下所示:
这可能是不正确的——我很快就输入了它——但你明白了。
有一些限制要记住:
- 该文件非常大 - 1GB+ - 所以我无法将它加载到内存中。
- 我应该只读一次。
- (显然)数据不能丢失或不正确。
好的,所以我目前有一个解析器,它将一个简单的 XML 文件转换为一个给定“ROWTAG”的 csv,这是其中包含记录的标签(person
在本例中)。你可以在这里看到它。
但它有一些限制。我知道如何修复/解决其中的大多数问题,但是如果不打破约束,我无法弄清楚其中的两个问题。
- 根据解析器的实现方式,标签的顺序很重要。假设我有一个如下所示的 xml 文件:
第一个记录标签中的中间名排在第二位,第二个记录中的中间名排在第三位。这将产生一个如下所示的 CSV 文件:
迈克尔的名字被记录为迈克尔乔丹罗斯,当时应该是迈克尔罗斯乔丹。
- 如果添加、删除或更改属性,程序不会反映这一点。这是因为程序只查看第一个记录元素中的标签,而不关心下一个元素中的标签(如示例一所示)。
让我们举这个例子:
生成的 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 调用。所以我认为我不能将标题转储到文件的第一行。无论如何,我什至不确定这是否可能。
所以。有哪位大神有想法吗?
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,我得到第一个错误。
我究竟做错了什么?
java - 如何将 XSD 用于非命名空间的文档
最近我遇到了一个以 XML 格式返回结果的服务,其方式如下
请注意,该文档没有命名空间定义。结果,没有我可以使用的“官方”模式。
我已经编写了一个模式定义,我可以使用它来生成可在代码中使用的类,以与文档中的等效元素进行交互。从观察中我可以看出文档格式没有改变(字段顺序保持不变,字段没有引入或消失)。但问题是,我仍然可以使用我的模式反序列化提供的文档吗?据我所知,schema必须定义一个命名空间,理论上是上面和下面的文档
不等价。
作为参考,我使用 stax 和 woodstox 6 作为实现。
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
。我想要的只是使用任何方法/库获得所需的输出。
有人可以帮我吗?我只想添加已经用几个节点创建的XML
from my List
to 。XMLEventWriter
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 设置为任何值都会导致以下堆栈跟踪:
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
什么对我更好:createXMLStreamReader
或createXMLEventReader
?
插件问题2
我需要调整我的 XSD/XML 文件吗?尤其是标题?
插件问题3
我需要在解析/验证之前解决 Xincludes 吗?如果是这样,怎么做?
进一步的背景
- 显然,代码处于早期阶段,我不太关心它是如何结束的。
- 我使用 XML1.1 因为我需要具有多个 ID 属性的 xml-tags。
- 我使用 XInclude 是因为我想以模块化方式定义我的 xml 文件以避免 xml 代码重复。
- Intellij 不验证我的文件,所以我特此尝试更深入地挖掘,但我认为这些问题到目前为止是不相关的,因为在这里我没有遇到验证问题,而我在另一个线程中遇到了一个问题
- 我将(几乎相同的问题)发布到 Woodstox 邮件列表,但几乎没有任何活动。线
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
标签出现错误,我没有收到。有人可以帮我理解这个问题并提供一些解决方法和帮助。