gpt4 book ai didi

java - 我如何在 JAXB 中执行某些操作,例如忽略 xml 元素的顺序?

转载 作者:行者123 更新时间:2023-12-02 07:22:22 25 4
gpt4 key购买 nike

更具体的问题:如何克服 JAXB 中的以下限制(如果可能):

1) 验证 xml 文件需要在 HD 上的某个位置创建架构文件。我不必创建新文件来验证 xml。我确实在使用一些流的堆栈溢出上找到了一篇关于此问题的帖子,但想知道是否还有其他方法。

2) 如何在我的文件中指定乱序的 xml 元素并仍然加载它。例如,我希望以下两个内容都能正确加载:

<xml>
<defaults .../>
<people>
...
</people>
</xml>

<xml>
<people>
...
</people>
<defaults .../>
</xml>

用于解码的代码:

JAXBContext context = JAXBContext.newInstance(MyConfig.class);

SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

context.generateSchema(new MySchemaOutputResolver(schemaF));

Unmarshaller unmarshaller = context.createUnmarshaller();
Schema schema = sf.newSchema(schemaF);
unmarshaller.setSchema(schema);
MyConfig loaded = (MyConfig)unmarshaller.unmarshal(settingsU);

private static class MySchemaOutputResolver extends SchemaOutputResolver {

public MySchemaOutputResolver(File schemaFile) {
this.schemaFile = schemaFile;
}

@Override
public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException {
return new StreamResult(schemaFile);
}

private File schemaFile;
}

属性也是如此。即乱序指定属性也应该有效。我没有测试过这些属性,但上面的内容肯定无法加载。 JAXB 强制元素顺序。在上面的例子中,哪个应该是可选的。

3) 允许属性和元素是可选的。如果未指定,文件仍应加载并且只是不设置缺少的属性(即使用类中初始化的默认值)。目前这也不起作用。如果我即使在 required=false 时也不放置属性,它就无法加载整个文件。

最佳答案

回答 1

您可以使用 Bean Validation (JSR 303) 注释来指定验证规则,而不是 XML 模式。

2 和 3 的答案

默认情况下,JAXB (JSR-222) 实现不要求元素按模式顺序排列,也不要求存在所需元素以便将 XML 解码为对象形式。如果您设置了 Schema,则可以设置 ValidationEventHandler 来忽略错误。

关于java - 我如何在 JAXB 中执行某些操作,例如忽略 xml 元素的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14048329/

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