8

これが実際には XPath の目的ではないことはわかっていますが、値に対する XPath 式の HashMap がある場合、XML ドキュメントを作成するにはどうすればよいでしょうか。dom-4j の DocumentHelper.makeElement(branch, xpath) を見つけましたが、属性やインデックスを作成することはできません。確かにこれを行うことができるライブラリが存在しますか?

Map xMap = new HashMap();

xMap.put("root/entity/@att", "fooattrib");
xMap.put("root/array[0]/ele/@att", "barattrib");
xMap.put("root/array[0]/ele", "barelement");
xMap.put("root/array[1]/ele", "zoobelement");

次のようになります。

<root>
<entity att="fooattrib"/>
<array><ele att="barattrib">barelement</ele></array>
<array><ele>zoobelement</ele></array>
</root>
4

3 に答える 3

2

私が思いついた最善の方法は、オブジェクトをxmlにマーシャル/アンマーシャルするJAXB実装を使用することです。次に、Dozer(http://dozer.sourceforge.net/documentation/mapbackedproperty.html)を使用してxpathをマップしました。これは、JAXBオブジェクトメソッドセッターへのマップのキーでした。

<mapping type="one-way" map-id="TC1">
<class-a>java.util.Map</class-a>
<class-b>org.example.Foo</class-b>
<field>
  <a key="root/entity/@att">this</a>
  <b>Foo.entity.att</b>
  <a-hint>java.lang.String</a-hint>
</field>

それは2段階の解決策のようなものですが、私にとっては本当にうまくいきました。

于 2012-06-21T18:23:58.487 に答える
2

私は数年前に似たようなものを探しました - 一種の書き込み可能な XPath です。結局、何も見つからなかったので、親の式に新しいノードを追加することで本質的に XML ドキュメントを構築する何かをハックしました。

parent="/" element="root"
parent="/root" element="entity"
parent="/root/entity" attribute="att" value="fooattrib"
parent="/root" element="array"
parent="/root" element="ele" text="barelement"

(これ自体が XML 構成ファイルによって管理されるため、上記のように表示されます。)

これの一部を自動化して最後のパス要素を取得し、何かを作成しようとするのは魅力的ですが、私は常に、そのようなばかげたアプローチが間違っている、書くことができる XPath 式があると感じていました。

私が検討した別のアプローチは実装しませんでしたが (上記は「十分」でした)、優れた Jaxen を使用して、存在しない要素をその場で生成することでした。

Jaxen FAQから:

必要なのは、インターフェース org.jaxen.Navigator の実装だけです。すべてのインターフェースが必要なわけではなく、org.jaxen.DefaultNavigator の形式のデフォルトの実装も提供されています。

DOMWriterNavigator要素が存在しない場合は、ラップして既存のメソッドDOMNavigatorを使用します。ただし、この方法を使用しても、や関数makeElementなどの XPath クエリの前処理と後処理が必要になる可能性があります。attributestext()

于 2008-11-24T16:40:22.093 に答える
2

また、自然が非常に動的であり、XSLT やオブジェクト マッピング フレームワークを使用したくないという同じ種類の要件が必要だったので、このコードを Java で実装し、ブログを書いたので、アクセスしてください。

http://ganesh-kandisa.blogspot.com/2013/08/dynamic-xml-transformation-in-java.html

または git リポジトリでコードをフォークし、

https://github.com/TheGanesh/DynamicXMLTransformer

于 2013-08-28T03:30:46.383 に答える