VTD-XML在给定位置添加属性

时间:2018-06-22 07:28:06

标签: vtd-xml

我需要在给定位置添加属性。例如,我的输入是

<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的给定位置添加属性。

1 个答案:

答案 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);
        }
}