首頁 >Java >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 被序列化時,屬性會以任意順序寫入。

可能的解決方案

有兩種方法可以解決此問題:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn