首页 > Java > java教程 > DOM 处理后如何维护 XML 属性顺序?

DOM 处理后如何维护 XML 属性顺序?

Patricia Arquette
发布: 2024-11-14 17:59:02
原创
684 人浏览过

How can I maintain XML attribute order after DOM processing?

DOM 处理后的 XML 属性顺序

使用标准文档对象模型 (DOM) 处理 XML 文件时,在序列化期间维护属性顺序不保证返回 XML。对于属性顺序至关重要的情况,这可能会出现问题。

此问题背后的原因在于 DOM 的设计。它将属性视为无序集合,忽略它们的顺序。当 XML 被序列化时,属性会以任意顺序写入。

可能的解决方案

有两种方法可以解决此问题:

1.使用 SAX(Simple API for XML)

基于 SAX 的解析器与 DOM 不同,提供了一种保留属性顺序的方法。通过利用 SAX 解析器,可以控制将属性写入结果 XML 的顺序。

2.自定义 XSLT 转换样式表

或者,您可以创建自定义 XSLT 转换样式表来指定所需的属性顺序。这涉及到定义显式指定属性顺序的输出模板。

保留属性顺序的原因

虽然有些人认为属性顺序在 XML 中无关紧要,但有合法的保留它的理由:

  • 回归测试:通过维护属性顺序可以更轻松地验证 XML 输出差异。
  • 人类可读性:将属性保持在原始顺序可以提高 XML 文件的可读性和可维护性,特别是对于手动编辑的配置文件。
  • 第三方工具:某些 XML 处理工具(例如 XML 编辑器)可能依赖属性顺序来正确处理

使用 SAX 的示例

以下 SAX 代码片段可用于在序列化期间保留属性顺序:

SAXParserFactory spf = SAXParserFactoryImpl.newInstance();
spf.setNamespaceAware(true);
spf.setValidating(false);
spf.setFeature("http://xml.org/sax/features/validation", false);
spf.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
SAXParser sp = spf.newSAXParser() ;
Source src = new SAXSource ( sp.getXMLReader(), new InputSource( input.getAbsolutePath() ) ) ;
String resultFileName = input.getAbsolutePath().replaceAll(".xml$", ".cooked.xml" ) ;
Result result = new StreamResult( new File (resultFileName) ) ;
TransformerFactory tf = TransformerFactory.newInstance();
Source xsltSource = new StreamSource( new File ( COOKER_XSL ) );
xsl = tf.newTransformer( xsltSource ) ;
xsl.setParameter( "srcDocumentName", input.getName() ) ;
xsl.setParameter( "srcDocumentPath", input.getAbsolutePath() ) ;

xsl.transform(src, result );
登录后复制

以上是DOM 处理后如何维护 XML 属性顺序?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板