Ordre des attributs XML après le traitement DOM
Lorsque vous travaillez avec des fichiers XML à l'aide du modèle d'objet de document (DOM) standard, maintien de l'ordre des attributs pendant la sérialisation le retour à XML n'est pas garanti. Cela peut être problématique dans les situations où l'ordre des attributs est crucial.
La raison de ce problème réside dans la conception du DOM. Il traite les attributs comme des collections non ordonnées, sans tenir compte de leur séquence. Lorsque le XML est sérialisé, les attributs sont écrits dans un ordre arbitraire.
Solutions possibles
Il existe deux approches pour résoudre ce problème :
1. L'utilisation de SAX (Simple API for XML)
Les analyseurs basés sur SAX, contrairement à DOM, fournissent un moyen de préserver l'ordre des attributs. En utilisant un analyseur SAX, il est possible de contrôler l'ordre dans lequel les attributs sont écrits dans le XML résultant.
2. Feuille de style de transformation XSLT personnalisée
Vous pouvez également créer une feuille de style de transformation XSLT personnalisée pour spécifier l'ordre des attributs souhaité. Cela implique de définir des modèles de sortie qui spécifient explicitement la séquence des attributs.
Raisons pour préserver l'ordre des attributs
Bien que certains soutiennent que l'ordre des attributs n'est pas pertinent en XML, il existe des raisons de le préserver :
Exemple d'utilisation de SAX
L'extrait de code SAX suivant peut être utilisé pour préserver l'ordre des attributs pendant la sérialisation :
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 );
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!