DOM 處理後的XML 屬性順序
使用標準文件物件模型(DOM) 處理XML 檔案時,在序列化期間維護屬性順序不保證返回XML。對於屬性順序至關重要的情況,這可能會出現問題。
此問題背後的原因在於 DOM 的設計。它將屬性視為無序集合,忽略它們的順序。當 XML 被序列化時,屬性會以任意順序寫入。
可能的解決方案
有兩種方法可以解決此問題:
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中文網其他相關文章!