gpt4 book ai didi

java - 解码缩进的 XML 在 Java 7 和 8 中给出不同的结果

转载 作者:行者123 更新时间:2023-11-30 11:03:17 27 4
gpt4 key购买 nike

切换到 Java 8 后我的一个测试失败了。这是一个浓缩示例:

public static class Wrapper {
@XmlMixed
@XmlAnyElement(lax = true)
public List<Object> content;
}

public static void main(String[] args) throws XMLStreamException, JAXBException {
final String xml = "<a>\n <b/>\n</a>";
final XMLInputFactory xif = XMLInputFactory.newFactory();
final XMLStreamReader xsr = xif.createXMLStreamReader(new StringReader(xml));

final JAXBContext context = JAXBContext.newInstance(Wrapper.class);
final Unmarshaller unmarshaller = context.createUnmarshaller();
final JAXBElement<Wrapper> element = unmarshaller.unmarshal(xsr, Wrapper.class);

System.out.println(element.getValue().content);
}

Java 7 (1.7.0_75) 的输出:ElementNSImplString

[[b: null], 
]

输出 Java 8 (1.8.0_45):StringElementNSImplString

[
, [b: null],
]

在这种情况下,Java 7 似乎忽略了前导空格,而 Java 8 则没有。我的问题是:

  • 这种不同行为的根本原因是什么?
  • 如何让 Java 8 像 Java 7 一样运行?或者至少与两个 Java 版本具有一致的行为?

PS:@XmlMixed @XmlAnyElement(lax = true) 听起来很可怕,但“包装器”类的代码是从 SharePoint WSDL 生成的。

最佳答案

与其使用与 Java 运行时捆绑在一起的默认 StAX 解析器(它可能在不同版本中表现不同),不如选择特定解析器的特定版本,并让您的应用程序依赖于它。您可以简单地包含(例如)Woodstox 的 JAR。在您的应用程序的类路径上,并依靠 XMLInputFactory.newFactory() 的默认行为来优先于捆绑的行为,但更安全(和更高性能)的是您自己直接实例化适当的对象。

XMLInputFactory xif = new com.ctc.wstx.stax.WstxInputFactory();

这样一来,您绝对可以保证使用您认为的解析器,而不管其他任何库将其他 JAR 文件添加到类路径/类加载器中。

关于java - 解码缩进的 XML 在 Java 7 和 8 中给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30464947/

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