DOM 處理後XML 中的屬性順序
使用文件物件模型(DOM) 操作XML 資料時,屬性的順序可能不同序列化後保留。如果維護屬性順序對於您的應用程式至關重要,這會帶來挑戰。
DOM 和屬性順序
DOM 不會在其內部表示中明確維護屬性的順序。因此,當您使用 DOM 方法如 getAttribute() 和 getAttributes() 擷取屬性時,順序可能與 XML 來源中的原始順序不同。
用於保留屬性順序的SAX
與DOM 不同,Simple API for XML (SAX) 提供了一種將XML 文件作為事件流進行遍歷的方法。透過建立 SAXParser 物件並註冊 SAX ContentHandler,您可以追蹤與 XML 文件的元素、屬性和其他方面相關的事件。
使用SAX 的範例
以下是Java 範例,示範如何使用SAX 保留屬性順序:
import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.SAXParser; import org.xml.sax.SAXException; import org.xml.sax.InputSource; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; import org.xml.sax.XMLReader; import org.xml.sax.ContentHandler; import org.xml.sax.helpers.DefaultHandler; public class PreserveAttributeOrderSAX { public static void main(String[] args) throws SAXException { SAXParserFactory spf = SAXParserFactoryImpl.newInstance(); spf.setNamespaceAware(true); spf.setValidating(false); try { 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(); XMLReader reader = sp.getXMLReader(); ContentHandler handler = new AttributeOrderContentHandler(); reader.setContentHandler(handler); reader.parse(new InputSource("sample.xml")); } catch (SAXNotSupportedException | SAXNotRecognizedException e) { e.printStackTrace(); } } } private static class AttributeOrderContentHandler extends DefaultHandler { @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { for (int i = 0; i < attributes.getLength(); i++) { String name = attributes.getQName(i); String value = attributes.getValue(i); // Process the attribute with its preserved order } } }
結論
雖然DOM 可能不會明確維護屬性順序,但SAX 提供了一種靈活的方法處理XML 文件並按其原始順序保留屬性。即使在使用 Java 的標準 XML API 基礎結構轉換或修改 XML 資料後,這也允許您保持屬性順序不變。
以上是如何在 DOM 處理後保留 XML 中的屬性順序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!