【问题标题】:Change xml attribute value with XPath with vtd-xml Java使用 vtd-xml Java 使用 XPath 更改 xml 属性值
【发布时间】:2017-05-18 11:38:21
【问题描述】:

我必须在这个xml中设置“count”属性的值:

<?xml version="1.0" encoding="UTF-8"?>
<task>
   <trigger count="myCount" interval="myInterval"/>
   <property name="myName" value="myValue"/>
   <property name="mySecondName"value="mySecondValue">
</task>

我想用这样的代码(VTDXML 库)用“Foo”更改 myCount 值:

            String count  = "Foo";
            if (vg.parseFile("C:\\Users\\_myPath_\\myFile.xml", true)) {
                VTDNav vn = vg.getNav();
                ap.bind(vn);
                xm.bind(vn);
                ap.selectXPath("/*[name()='task']/*[name()='trigger']");
                int i=0;
                while((i=ap.evalXPath())!=-1){
                    xm.insertAfterHead(count);
                }
                xm.output("C:\\Users\\_myPath_\\myFileWithFoo.xml");
                System.out.println(vg);
            }

这样我反而得到了

  <trigger count="myCount" interval="myInterval">Foo</trigger>

那不是我的目标,因为我想要的是

  <trigger count="Foo" interval="myInterval"/>

【问题讨论】:

    标签: java xml parsing xpath vtd-xml


    【解决方案1】:

    我发现此解决方案适用于更改“计数”和“间隔”的内容:

               String count= "Foo";
               String interval= "Dummy";       
               String attribute  = " count=\""+ foo + "\" interval=\""+ interval+"\"";
                if (vg.parseFile("C:\\Users\\_myPath_\\myFile.xml", true)) {
                    VTDNav vn = vg.getNav();
                    ap.bind(vn);
                    xm.bind(vn);
                    ap.selectXPath("/*[name()='task']/*[name()='trigger']");
                    int i=0;
                    while((i=ap.evalXPath())!=-1){
                        xm.insertAttribute(attribute);
                    }
                    xm.output("C:\\Users\\_myPath_\\myFileWithFoo.xml");
                    System.out.println(vg+attribute);
                }
    

    结果是:

     <trigger count="Foo" interval="Dummy" />
    

    我使用方法 insertAttribute 将我的字符串附加到节点的名称(触发器)。

    我知道这是一个糟糕的解决方案,但效果很好。

    【讨论】:

    • 你的 xpath 很奇怪.. 为什么不直接使用 /task/trigger?
    • 因为我在任务标签中有 xmlns,这是我可以达到这个目标的唯一方法......也许还有其他解决方案,但正如我在之前的评论中所说,我会继续周一合适的电脑,我会解释一切。谢谢 vtd-xml-author,你的作品非常非常好。
    【解决方案2】:

    你的 xpath 应该是 /task/trigger/@count

    改变attr值的语句为xmlModifier.updateToken(i+1)

    下面是一个不使用命名空间的示例...

    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    
    import com.ximpleware.*;
    
    public class updateAttrVal2 {
        public static void main(String[] s) throws VTDException,UnsupportedEncodingException,IOException{
            VTDGen vg = new VTDGen();
            String xml="<task xmlns='ns1' xmlns:abc='ns2'><abc:trigger count=\"myCount\" interval=\"myInterval\"/></task>";
            vg.setDoc(xml.getBytes());
            vg.parse(false);
            VTDNav vn=vg.getNav();
            AutoPilot ap = new AutoPilot(vn);
            XMLModifier xm = new XMLModifier(vn);
            ap.selectXPath("/task/trigger/@count");
            int i=0;
            while((i=ap.evalXPath())!=-1){
                xm.updateToken(i+1, "Count");
            }
            XMLByteOutputStream xms = new XMLByteOutputStream(xm.getUpdatedDocumentSize());
            xm.output(xms);
            System.out.println(xms.toString());
        }
    }
    

    【讨论】:

    • 我尝试了这个解决方案,但我遇到了错误。现在我不在我开发的电脑上,我会在下周一更准确,谢谢。
    • 你可以关闭命名空间感知...这将工作
    • 我必须保存命名空间信息,这是 wso2 esb 配置 xml,所以我无法关闭它们。我尝试使用 updateToken(i+1, "myCount") 但它不起作用,触发标记保持空白
    • 我很快就会发一篇sn-p的文章...敬请期待
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多