我需要在给定位置添加属性。例如,我的输入是
<Transaction Type="a">
</Transaction>
我想在位置1添加属性。我希望类似
<Transaction price="1" count="1" Type="a">
</Transaction>
我调用以下方法。在这里,我将新属性附加到已经存在的属性中。我删除已经存在的属性,并尝试在末尾添加附加属性。我在insertedAttributes
中有属性。 xm.insertAttribute(insertedAttributes.toString());
似乎没有更新属性。因此,它导致
<Transaction>
</Transaction>
代码:
vtdXmlUtil.setComponents(transaction);
vtdXmlUtil.addAttributeAtPosition("/Transaction", "count=\"1\"", 1);
vtdXmlUtil.addAttributeAtPosition("/Transaction", "price=\"1\"", 1);
public void addAttributeAtPosition(String xPath, String attribute, int position) throws IOException, VTDException {
ap.selectXPath(xPath);
int i;
StringBuilder insertedAttributes = new StringBuilder();
while ((i = ap.evalXPath()) != -1) {
int count = vnav.getAttrCount();
count = count * 2;
int loc = 1;
for (int attr = 1; attr <= count; attr = attr + 2) {
if (loc == position) {
insertedAttributes = insertedAttributes.append(attribute);
}
insertedAttributes = insertedAttributes.append(" " + vnav.toString(i + attr) + "=\"" + vnav.toString(i + attr + 1) + "\"");
xm.removeAttribute(i + attr);
loc++;
}
}
vnav = xm.outputAndReparse();
ap.bind(vnav);
xm.bind(vnav);
xm.insertAttribute(insertedAttributes.toString());
vnav = xm.outputAndReparse();
ap.bind(vnav);
xm.bind(vnav);
}
我可能缺少一些东西。还有其他方法可以使用朴素的方法在Im的给定位置添加属性。
答案 0 :(得分:0)
在调用XMLModifier的输出或outputAndParse()方法之前,不会更新VTD-XML的输出。
请注意,当您调用各种插入方法时,您所做的只是保留这些更改的记录,无论是删除,添加还是更新...
我阅读了您的代码,在任何地方都看不到这样的调用...
==============这里的新材料=============== 我能够使您的代码适应我的本地环境,这似乎对我有用...下面是您会非常熟悉的代码。
import java.io.ByteArrayOutputStream;
import com.ximpleware.*;
public class attrTest {
static VTDNav vnav;
static VTDGen vg;
static AutoPilot ap;
static XMLModifier xm;
public static void main(String s[])throws java.io.IOException,VTDException{
vg = new VTDGen();
vg.setDoc(("<Transaction Type=\"a\">"+
"</Transaction> ").getBytes());
vg.parse(false);
//System.out.println(vg.);
vnav=vg.getNav();
ap = new AutoPilot();
ap.bind(vnav);
xm = new XMLModifier(vnav);
addAttributeAtPosition("/Transaction", " count=\"1\"", 1);
addAttributeAtPosition("/Transaction", " price=\"1\"", 1);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
xm.output(baos);
System.out.println(" "+baos.toString());
}
public static void addAttributeAtPosition(String xPath, String attribute, int position) throws java.io.IOException, VTDException {
ap.selectXPath(xPath);
int i;
StringBuilder insertedAttributes = new StringBuilder();
while ((i = ap.evalXPath()) != -1) {
int count = vnav.getAttrCount();
count = count * 2;
int loc = 1;
for (int attr = 1; attr <= count; attr = attr + 2) {
if (loc == position) {
insertedAttributes = insertedAttributes.append(attribute);
}
insertedAttributes = insertedAttributes.append(" " + vnav.toString(i + attr) + "=\"" + vnav.toString(i + attr + 1) + "\"");
xm.removeAttribute(i + attr);
loc++;
}
}
vnav = xm.outputAndReparse();
ap.bind(vnav);
xm.bind(vnav);
xm.insertAttribute(insertedAttributes.toString());
vnav = xm.outputAndReparse();
ap.bind(vnav);
xm.bind(vnav);
}
}