2

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 の世界全体にあまり強くありません。

誰でもこれを行う方法を提案できますか?

4

3 に答える 3

4

次の Saxon リリース (9.5、まもなくリリース予定) には、属性の順序を制御できるシリアライゼーション属性があります。これは正当なユースケースのために追加されました (たとえば、id 属性が常に最初に来るようにすることで、人間の可読性を向上させることができます)。大企業に雇われているプログラマーもそうですが、それで問題が解決するなら、私は泣きません。

于 2013-04-16T08:19:45.383 に答える
0

ハックのように聞こえますが、この属性の名前を x1allowmultiple のように変更すると、最後の属性になります。

  • allowmultiple をすべて検索して x1allowmultiple に置き換えます
  • x1allowmultiple で処理を行い、出力ファイルを作成します
  • すべての x1allowmultiple を検索して allowmultiple に置き換えます
于 2013-04-16T07:54:52.647 に答える