VTD-XML を使用して XML ファイルを更新しています。これで、要素の属性を維持する柔軟な方法を取得しようとしています。したがって、元の要素が次の場合:
<MyElement name="myName" existattr="orig" />
これを次のように更新できるようにしたいと思います。
<MyElement name="myName" existattr="new" newattr="newValue" />
Map を使用してコード内の属性/値のペアを管理しています。XML を更新するときは、次のようにしています。
private XMLModifier xm = new XMLModifier();
xm.bind(vn);
for (String key : attr.keySet()) {
int i = vn.getAttrVal(key);
if (i!=-1) {
xm.updateToken(i, attr.get(key));
} else {
xm.insertAttribute(key+"='"+attr.get(key)+"'");
}
}
vn = xm.outputAndReparse();
これは既存の属性を更新するために機能しますが、属性がまだ存在しない場合、挿入 (insertAttribute) にヒットし、「ModifyException」が発生します。
com.ximpleware.ModifyException: There can be only one insert per offset
at com.ximpleware.XMLModifier.insertBytesAt(XMLModifier.java:341)
at com.ximpleware.XMLModifier.insertAttribute(XMLModifier.java:1833)
私の推測では、オフセットを直接操作していないので、これは予想されることです。ただし、要素内の位置 (最後) に an 属性を挿入する機能はありません。
私の疑いは、 xm.insertBytesAt(int offset, byte[] content) のようなものを使用して「オフセット」レベルでそれを行う必要があるということです-これは私が入る必要のある領域であるため、まだ計算する方法はありますか挿入できるオフセット (タグの末尾の直前)?
もちろん、私はここで VTD を何らかの形で誤用している可能性があります。これを達成するためのより良い方法があれば、喜んで指示されます。
ありがとう