使用 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
(它是一个具有load
和store
方法的抽象类)并以您自己的方式完成这些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 属性的主要内容,如果未能解决你的问题,请参考以下文章