ホームページ >Java >&#&チュートリアル >DOM 処理後に XML 属性の順序を維持するにはどうすればよいですか?

DOM 処理後に XML 属性の順序を維持するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-14 17:59:02659ブラウズ

How can I maintain XML attribute order after DOM processing?

DOM 処理後の XML 属性の順序

標準のドキュメント オブジェクト モデル (DOM) を使用して XML ファイルを操作する場合、シリアル化中に属性の順序が維持されます。 XML に戻ることは保証されていません。これは、属性の順序が重要な状況では問題となる可能性があります。

この問題の背後にある理由は、DOM の設計にあります。属性は順序を無視して、順序のないコレクションとして扱われます。 XML がシリアル化されると、属性は任意の順序で書き込まれます。

考えられる解決策

この問題に対処するには 2 つのアプローチがあります。

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。