模块java.xml


模块java.xml
定义用于 XML 处理的 Java API (JAXP)、用于 XML 的流式 API (StAX)、用于 XML 的简单 API (SAX) 和 W3C 文档对象模型 (DOM) API。

JAXP 查找机制

JAXP 定义了一个有序的查找过程以确定要为 JAXP 工厂加载的实现类。下表列出了支持该机制的工厂以及过程中使用的方法、系统属性名称、配置文件和系统默认方法。
JAXP 工厂
工厂 Method 系统属性名称 配置文件 系统默认
DatatypeFactory newInstance() javax.xml.datatype.DatatypeFactory jaxp.properties newDefaultInstance()
DocumentBuilderFactory newInstance() javax.xml.parsers.DocumentBuilderFactory jaxp.properties newDefaultInstance()
SAXParserFactory newInstance() javax.xml.parsers.SAXParserFactory jaxp.properties newDefaultInstance()
XMLEventFactory newFactory() javax.xml.stream.XMLEventFactory stax.properties 然后是 jaxp.properties newDefaultFactory()
XMLInputFactory newFactory() javax.xml.stream.XMLInputFactory stax.properties 然后是 jaxp.properties newDefaultFactory()
XMLOutputFactory newFactory() javax.xml.stream.XMLOutputFactory stax.properties 然后是 jaxp.properties newDefaultFactory()
TransformerFactory newInstance() javax.xml.transform.TransformerFactory jaxp.properties newDefaultInstance()
SchemaFactory newInstance(schemaLanguage) javax.xml.validation.SchemaFactory: 模式语言[1] jaxp.properties newDefaultInstance()
XPathFactory newInstance(uri) DEFAULT_PROPERTY_NAME + ":uri"[2] jaxp.properties newDefaultInstance()
[1]在哪里模式语言newInstance(schemaLanguage) 方法的参数。

[2]在哪里urinewInstance(uri) 方法的参数。

jaxp.properties

jaxp.properties 是标准 Properties 格式的配置文件,通常位于 Java 安装的 conf 目录中。它包含实现类的完全限定名称,键是上面 桌子 中定义的系统属性名称。

jaxp.properties 文件只被实现读取一次,然后缓存值以备将来使用。如果在第一次尝试读取文件时该文件不存在,则不会进一步尝试检查其是否存在。任何属性的值在第一次被读取后是不可能改变的。

stax.properties

stax.properties 是一个配置文件,其功能与 jaxp.properties 相同,只是它仅供 StAX 工厂查找使用。

查找程序

JAXP 工厂 按照下面描述的过程来定位和加载实现类:
实现注意事项:

特定于实现的特性和属性

除了此模块的公共 API 中描述的标准功能和属性之外,JDK 实现还支持更多特定于实现的功能和属性。本节描述命名约定、系统属性、jaxp.properties、范围和顺序,以及属性适用的处理器。可以在本说明的末尾找到列出了实现当前支持的实现特定功能和属性的表格。

命名约定

特征和属性的名称是完全限定的,由前缀和名称组成。

字首

JDK 功能和属性的前缀,以及它们相应的系统属性(如果有)定义为:
   jdk.xml. 
 

Name

名称可能由一个或多个区分大小写的单词组成。第一个单词的所有字母都是小写的,而每个后续单词的第一个字母都是大写的。

因此,指示 XML 文档是否独立的属性示例将具有以下格式:

   jdk.xml.isStandalone 
 
和相应的系统属性:
   jdk.xml.isStandalone 
 

系统属性

一个属性可能有一个相应的同名系统属性。系统属性应在创建处理器之前设置,之后可能会被清除。

jaxp.properties

可以在 jaxp.properties 文件中指定一个系统属性来设置 JDK 的所有调用的行为。格式为 system-property-name=value 。例如:
   jdk.xml.isStandalone=true 
 

范围和顺序

包括 DOM、SAX、模式验证、XSLT 和 XPath 在内的 XML 处理器需要 XMLConstants.FEATURE_SECURE_PROCESSING 功能(以下称为安全处理)。当安全处理设置为 true 时,将强制执行与安全相关的功能和属性,例如表 实现特定功能Properties 中标记为 "security: yes"(以下称为安全属性)的功能和属性。此类实施包括将安全属性和功能设置为更具限制性的值和限制,如表中 "Value" 的子列 "Enforced" 所示。但是,当安全处理设置为 false 时,属性值不会受到影响。

当 Java 安全管理器存在时,安全处理设置为 true 且无法关闭。因此强制执行安全属性。

jaxp.properties 文件中指定的属性会影响 JDK 的所有调用,并将重写它们的默认值或可能已通过安全处理设置的值。

设置系统属性后,会影响 JDK 的调用并重写默认设置或可能已在 jaxp.properties 中或通过安全处理设置的设置。

通过 JAXP 工厂或处理器(例如 SAXParser)指定的 JAXP 属性优先于系统属性、jaxp.properties 文件以及安全处理。

处理器支持

一个或多个处理器可能支持特性和属性。下表按ID列出了处理器,可供参考。
处理器
ID Name 如何设置属性 如何设置功能
DOM DOM 解析器 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setAttribute(name, value);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature(name, value);
SAX SAX 解析器 SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser parser = spf.newSAXParser();
parser.setProperty(name, value);
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setFeature(name, value);
标准AX StAX 解析器 XMLInputFactory xif = XMLInputFactory.newInstance();
xif.setProperty(name, value);
XMLInputFactory xif = XMLInputFactory.newInstance();
xif.setProperty(name, value);
验证 XML 验证 API SchemaFactory schemaFactory = SchemaFactory.newInstance(schemaLanguage);
schemaFactory.setProperty(name, value);
SchemaFactory schemaFactory = SchemaFactory.newInstance(schemaLanguage);
schemaFactory.setFeature(name, value);
Transform XML 转换 API TransformerFactory factory = TransformerFactory.newInstance();
factory.setAttribute(name, value);
TransformerFactory factory = TransformerFactory.newInstance();
factory.setFeature(name, value);
XSLTC 序列化程序 XSLTC 序列化程序 Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(name, value);
DOMLS DOM 加载和保存 LSSerializer serializer = domImplementation.createLSSerializer();
serializer.getDomConfig().setParameter(name, value);
XPath XPath N/A XPathFactory factory = XPathFactory.newInstance();
factory.setFeature(name, value);

特定于实现的特性和属性

特定于实现的特性和属性反映了 JDK 在遵守 API 规范的同时管理资源限制的选择,或者允许应用程序改变超出标准要求的行为。

下表列出了 JDK 当前支持的特定于实现的属性。如有必要,将来可能会添加更多属性。

实现特定属性
全名 (前缀+名称) [1] Description API 属性 [2] 系统属性[3] jaxp.properties[3] [4] 安全[5] 支持的处理器 [6] 由于[7]
Type Value 默认 强制执行
jdk.xml.entityExpansionLimit 限制实体扩展的数量。 yes yes yes Integer 一个正整数。小于或等于 0 的值表示没有限制。如果该值不是整数,则抛出 NumberFormatException。 64000 64000 是的 DOM
SAX
标准AX
验证
Transform
8
jdk.xml.elementAttributeLimit 限制元素可以具有的属性数。 10000 10000
jdk.xml.maxOccurLimit 限制在为 W3C XML 架构构建语法时可能创建的内容模型节点的数量,该架构包含 maxOccurs 属性,其值不是“unbounded”。 5000 5000
jdk.xml.totalEntitySizeLimit 限制包括一般和参数实体在内的所有实体的总大小。大小计算为所有实体的聚合。 5x10^7 5x10^7
jdk.xml.maxGeneralEntitySizeLimit 限制任何一般实体的最大大小。 0 0
jdk.xml.maxParameterEntitySizeLimit 限制任何参数实体的最大大小,包括嵌套多个参数实体的结果。 10^6 10^6
jdk.xml.entityReplacementLimit 限制所有实体引用中的节点总数。 3x10^6 3x10^6
jdk.xml.maxElementDepth 限制最大元素深度。 0 0
jdk.xml.maxXMLNameLimit 限制 XML 名称的最大大小,包括元素名称、属性名称和名称空间前缀和 URI。 1000 1000
jdk.xml.isStandalone 指示序列化程序应将输出视为独立文档。该属性可用于确保在 XML 声明之后写入换行符。与属性 xml-declaration 不同,此属性对是否应写出 XML 声明没有影响。 yes yes yes boolean 真假 false N/A DOMLS 17
jdk.xml.xsltcIsStandalone 指示 XSLTC 序列化器 应将输出视为独立文档。该属性可用于确保在 XML 声明之后写入换行符。与属性 OMIT_XML_DECLARATION 不同,此属性对是否应写出 XML 声明没有影响。

此属性的行为与上述 DOMLS 的行为类似,只是它是针对 XSLTC 序列化程序 且其值为字符串。

yes yes yes String 是/否 no N/A XSLTC 序列化程序 17
jdk.xml.cdataChunkSize 指示解析器在属性为零或未指定时以单个块的形式返回 CData 部分中的数据,或者在属性大于零时以多个块的形式返回数据。解析器应按换行符拆分数据,并将任何大于指定大小的块拆分为等于或小于指定大小的块。 yes yes yes Integer 一个正整数。小于或等于 0 的值表示未指定属性。如果该值不是整数,则抛出 NumberFormatException。 0 N/A SAX
标准AX
9
jdk.xml.extensionClassLoader 设置一个非空的 ClassLoader 实例,用于加载 XSLTC java 扩展函数。 yes no no Object 对 ClassLoader 对象的引用。如果未指定值,则为空。 无效的 N/A Transform 9
jdk.xml.xpathExprGrpLimit 限制 XPath 表达式可以包含的组数。 Transform:是的
XPath:没有
yes yes Integer 一个正整数。小于或等于 0 的值表示没有限制。如果该值不是整数,则抛出 NumberFormatException。 10 10 是的 Transform
XPath
19
jdk.xml.xpathExprOpLimit 限制 XPath 表达式可以包含的运算符数量。 100 100
jdk.xml.xpathTotalOpLimit 限制 XSL 样式表中 XPath 运算符的总数。 yes 10000 10000 Transform

下表列出了 JDK 当前支持的特定于实现的功能。如有必要,将来可能会添加更多功能。

实现特定功能
全名 (前缀+名称) [1] Description API 属性 [2] 系统属性[3] jaxp.properties[3] [4] 安全[5] 支持的处理器 [6] 由于[7]
Type Value 默认 强制执行
jdk.xml.enableExtensionFunctions 确定是否允许 XSLT 和 XPath 扩展函数。 yes yes yes Boolean 对或错。 True 表示允许扩展函数;否则为假。 true false 是的 Transform
XPath
8
jdk.xml.overrideDefaultParser 允许使用第 3 方的解析器实现来重写 JDK 的转换、验证和 XPath 实现的系统默认解析器。 对或错。 True 允许使用第 3 方的解析器实现在 XML 转换、验证或 XPath 操作期间重写系统默认实现。 False 禁止使用第 3 方的解析器实现。 false false 是的 Transform
验证
XPath
9
jdk.xml.resetSymbolTable 指示解析器在每次解析操作期间重置其内部符号表。 对或错。 True 表示与解析器关联的 SymbolTable 需要在每次解析操作期间重新分配。
False 指示解析器的 SymbolTable 实例应在后续解析操作期间重用。
false N/A SAX 9

[1]应使用属性的全名来设置属性。

[2]值“yes”表示该属性可以通过处理器或其工厂设置,否则为“no”。

[3]值“yes”表示该属性有相应的系统属性,否则为“no”。

[4]该值必须与此表中所列的完全一致,区分大小写。相应系统属性的值是属性值的字符串表示形式。如果类型是boolean,则系统属性只有在为“真”时才为真;如果类型为 String,则系统属性仅当它与表示正值的字符串完全相同时才为真(例如,xsltcIsStandalone 为“yes”);否则系统属性为假。如果类型是整数,则系统属性的值是该值的字符串表示形式(例如,“64000”代表 entityExpansionLimit)。

[5]值“yes”表示该属性是安全属性。请参阅 范围和顺序,了解安全处理如何影响安全属性的值。

[6]支持该属性的一个或多个处理器。该字段的值是表 处理器 中描述的 ID。

[7]指示引入属性的初始版本。

遗留属性名称(已弃用)

JDK 17 之前的 JDK 版本支持对属性使用 URI 样式前缀。这些遗留属性名称是弃用从 JDK 17 开始,可能会在未来的版本中删除。如果同时设置了新属性和旧属性,则无论设置方式和位置如何,新属性名称都优先。 范围和顺序 中定义的覆盖顺序因此变为,按降序排列:
  • 默认值;
  • 由 FEATURE_SECURE_PROCESSING 设置的值;
  • jaxp.properties 中设置的值;
  • 值设置为系统属性;
  • 在工厂或处理器上设置的值使用遗留属性名称;
  • 使用新属性名称在工厂或处理器上设置的值。

下表列出了属性及其对应的旧名称。

遗留属性名称(自 17 起弃用)
属性 遗留财产名称
jdk.xml.entityExpansionLimit http://www.oracle.com/xml/jaxp/properties/entityExpansionLimit
jdk.xml.elementAttributeLimit http://www.oracle.com/xml/jaxp/properties/elementAttributeLimit
jdk.xml.maxOccurLimit http://www.oracle.com/xml/jaxp/properties/maxOccurLimit
jdk.xml.totalEntitySizeLimit http://www.oracle.com/xml/jaxp/properties/totalEntitySizeLimit
jdk.xml.maxGeneralEntitySizeLimit http://www.oracle.com/xml/jaxp/properties/maxGeneralEntitySizeLimit
jdk.xml.maxParameterEntitySizeLimit http://www.oracle.com/xml/jaxp/properties/maxParameterEntitySizeLimit
jdk.xml.entityReplacementLimit http://www.oracle.com/xml/jaxp/properties/entityReplacementLimit
jdk.xml.maxElementDepth http://www.oracle.com/xml/jaxp/properties/maxElementDepth
jdk.xml.maxXMLNameLimit http://www.oracle.com/xml/jaxp/properties/maxXMLNameLimit
jdk.xml.isStandalone http://www.oracle.com/xml/jaxp/properties/isStandalone
jdk.xml.xsltcIsStandalone http://www.oracle.com/xml/is-standalone
http://www.oracle.com/xml/jaxp/properties/xsltcIsStandalone
jdk.xml.extensionClassLoader jdk.xml.transform.extensionClassLoader
jdk.xml.enableExtensionFunctions http://www.oracle.com/xml/jaxp/properties/enableExtensionFunctions
模块图:
Module graph for java.xmlModule graph for java.xml
自从:
9