当前位置: 首页 > 知识库问答 >
问题:

使用XPath和vtd xml Java更改xml属性值

易炳
2023-03-14

我必须在这个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"/>

共有2个答案

柯琛
2023-03-14

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

更改属性值的语句是xmlModifier。updateToken(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());
    }
}
吴欣悦
2023-03-14

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

           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" />

我使用了将我的字符串附加到节点名称(触发器)的插入属性方法。

我知道这是一个可怕的解决方案,但它工作正常。

 类似资料:
  • 我是Selenium的新手,需要能够使用属性和文本对以下元素进行xpath。 我正在使用 但我还需要它带有属性,以便将其缩小到单个元素。

  • 问题内容: 有没有一种方法可以使用jQuery更改CSS类的属性,而不是元素属性? 这是一个实际的例子: 我上课有一个div 我想更改类背景属性,而不是已分配类背景的元素。 如果我使用jQuery .css()方法做到这一点: 它会影响现在具有class的元素。到这里为止一切都很好。但是,如果我进行Ajax调用,并在class中插入更多div ,则这些背景将不会具有绿色背景,而它们将具有初始背景。

  • 问题内容: 我需要找到一种使用JavaScript更改CSS:hover属性的方法。 例如,假设我有以下HTML代码: 以及以下CSS代码: 我想使用JavaScript将悬停属性更改为例如background:#00ff00。知道我可以使用JavaScript通过以下方式访问样式背景属性: 但是我不知道:hover的JavaScript等效项。如何使用JavaScript更改这些的:hover背

  • 问题内容: 我使用FlexJson进行序列化,唯一的问题是它会生成小写的字段名,而我需要它们以大写开头: 当序列化时,字段被序列化为,而我需要它被序列化。 如何指定输出字段名称?我可以使用一些属性来指定所需的序列化名称吗? 问题答案: 您可以使用“ 自定义变压器” 来实现。根据Flexjson页面转换器是: 负责确定如何将传入的对象转换为JSON,对JSONContext对象进行适当的调用以输出J

  • 我试图创建一个java程序,它将在WebSphere上编辑JVM的类路径属性。我现在能够将程序连接到服务器,也能找到节点,但我不知道下一步该做什么。我应该使用哪个MBean来找到JVM类路径并对其进行配置?我知道我可以在管理控制台上编辑它,但是对于这个任务,我真的必须使用Java程序来完成。 我也不允许使用wsadmin和jacl/jython脚本。 这是我目前的代码: 任何帮助都将不胜感激。非常

  • 检索给定节点resp的所有属性名(而不是属性值!)的Xpath表达式看起来如何。xml标签? 假设以下XML文档: Xpath//title/@*会选择“eng,fr,easyreading”,但哪个Xpath会选择“lang,lang,type”?