DOM 処理後の XML 属性の順序
標準のドキュメント オブジェクト モデル (DOM) を使用して XML ファイルを操作する場合、シリアル化中に属性の順序が維持されます。 XML に戻ることは保証されていません。これは、属性の順序が重要な状況では問題となる可能性があります。
この問題の背後にある理由は、DOM の設計にあります。属性は順序を無視して、順序のないコレクションとして扱われます。 XML がシリアル化されると、属性は任意の順序で書き込まれます。
考えられる解決策
この問題に対処するには 2 つのアプローチがあります。
1. SAX (Simple API for XML) の使用
SAX ベースのパーサーは、DOM とは異なり、属性の順序を保持する方法を提供します。 SAX パーサーを利用すると、結果の XML に属性を書き込む順序を制御できます。
2.カスタム XSLT 変換スタイルシート
または、カスタム XSLT 変換スタイルシートを作成して、必要な属性の順序を指定することもできます。これには、属性の順序を明示的に指定する出力テンプレートの定義が含まれます。
属性の順序を保持する理由
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 サイトの他の関連記事を参照してください。