首頁  >  文章  >  Java  >  如何在 DOM 處理後保留 XML 中的屬性順序?

如何在 DOM 處理後保留 XML 中的屬性順序?

Linda Hamilton
Linda Hamilton原創
2024-11-14 10:32:02484瀏覽

How Can I Preserve Attribute Order in XML After DOM Processing?

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

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