DOM 处理后 XML 中的属性顺序
使用文档对象模型 (DOM) 操作 XML 数据时,属性的顺序可能不同序列化后保留。如果维护属性顺序对于您的应用程序至关重要,这会带来挑战。
DOM 和属性顺序
DOM 不会在其内部表示中显式维护属性的顺序。因此,当您使用 getAttribute() 和 getAttributes() 等 DOM 方法检索属性时,顺序可能与 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中文网其他相关文章!