XML要素に属性の順序を強制することについて人々が尋ねた多くの投稿を読みましたが、一般的な反応は、それは合法/必須/許可/関連/その他ではありません.
属性の順序を気にするべきではないという回答は求めていませんので、それがあなたの見解である場合は返信しないでください。
解決策が必要な本当の問題があります。大企業の製品は、製品の最新バージョンで次の 2 つの要素を異なるものとして扱います。
<objquestion allowmultiple="true" id="7432" idtext="7433" idvar="7429" parent="7430" questiontype="multchoice">
<objquestion id="7432" idtext="7433" idvar="7429" parent="7430" questiontype="multchoice" allowmultiple="true">
特に、「allowmultiple」属性が「questiontype」の後にある場合、それは質問タイプの修飾子として機能します。それが前にある場合、それは無視されます。
そのため、短期間で製品を修正する可能性は低いです。
を使用してこの XML コンテンツを操作しています
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
doc = dbf.newDocumentBuilder().parse(new InputSource(path));
内部実装は、DOM ノード マップ内の属性を並べ替えます。ファイルに書き戻されると、現在ソートされている順序で属性が書き込まれます。XPath を使用して Document オブジェクトをいじっているコードがたくさんあります。
ドキュメントの操作が完了したら、現在それを書き戻します
Transformer xformer = TransformerFactory.newInstance().newTransformer();
xformer.transform(new DOMSource(lc.getDocument()), new StreamResult(new File(paths[1])));
私ができる必要があるのは、質問タイプの後に allowmultiple 属性が書き込まれるようにすることです。
DOM ツリーを書き戻すために使用されるシリアライゼーションに影響を与えることができるかどうか、または属性を最初にソートされたマップに解析しない別の実装に単純に置き換えることができるかどうかを理解しようとしました。どちらもうまくいくと思いますが、これを行う方法を見つけることができませんでした。
LSSerializer を見ましたが、その特定の要素を傍受する方法がわかりません。FileOutputStream を拡張して何かを探す必要がありますか?
SAX は最初の並べ替えを行わない可能性があることを読みましたが、多くの新しいコードを追加せずにパーサーをドロップできるようにする必要があり、XML の世界全体にあまり強くありません。
誰でもこれを行う方法を提案できますか?