使用 XSD 模式来描述“storeToXML”生成的 Java 属性

Posted

技术标签:

【中文标题】使用 XSD 模式来描述“storeToXML”生成的 Java 属性【英文标题】:Use XSD schema to describe Java Properties generated by 'storeToXML ' 【发布时间】:2016-10-16 09:43:04 【问题描述】:

我使用Properties#storeToXML 将java.util.Properties 转换为XML 格式。但是,默认情况下,它会为其生成带有 DTD 架构的 XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    ...
</properties>

是否可以改为使用 XSD 架构?如何重新配置​​?

【问题讨论】:

我将 oracle 文档读为“它是 DTD - 句号”。我没有发现任何可以切换到 XSD 的提示。但是:文档说,它并没有真正“使用”过。它只是唯一地命名一个。所以对我来说,问题出现了:你为什么要这样做? @Fildor 我只想为我的应用程序生成的每个 XML 提供 XSD 架构以保持一致性 【参考方案1】:

使用默认类,似乎无法将 doctype 声明更改为基于 XSD 的方法。

但似乎有一种 plugin 方法可以干预 XML 存储行为(至少在 Java 8 中):Properties.storeToXml 方法在内部委托给 loaded XmlPropertiesProvider(来自包sun.util.spi)。

通过检查系统属性“sun.util.spi.XmlPropertiesProvider”或(如果未找到)使用service loader mechanism 加载此属性提供程序。

通过这种方法,您可以自己实现一个XmlPropertiesProvider(它是一个具有loadstore 方法的抽象类)并以您自己的方式完成这些XML 部分。


至少从 2016 年 5 月开始,Properties 类使用 jdk.internal.util.xml.PropertiesDefaultHandler 和以下硬编码对象实例化来存储和加载 XML:

PropertiesDefaultHandler handler = new PropertiesDefaultHandler();

这意味着以下代码将不再用于为基于 XML 的属性设置默认处理程序:

System.setProperty(
    "sun.util.spi.XmlPropertiesProvider",
    XmlPropertiesTransformer.class.getCanonicalName()
);

似乎没有办法引入不同的处理程序,因为PropertiesDefaultHandler 类不允许注入自定义处理程序。

【讨论】:

所有这些只是为了“一致性”吗?对我来说似乎有点过头了。但是为找到这种可能性而感到自豪!

以上是关于使用 XSD 模式来描述“storeToXML”生成的 Java 属性的主要内容,如果未能解决你的问题,请参考以下文章

如何定义XSD并在XML中使用XSD

XML的验证模式DTD与XSD的区别

如何从 XSD 创建 BQ 模式

难以对齐 JSONschema 和 XSD 等效项

使用 XJC 进行 XSD 模式解析

验证 XSD 架构?