使用 vtd-xml Java 使用 XPath 更改 xml 属性值
Change xml attribute value with XPath with vtd-xml Java
我必须在此 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 库)将 myCount 值更改为 "Foo":
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"/>
我发现此解决方案适用于更改 "count" 和 "interval" 的内容:
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/@count
改变属性值的语句是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());
}
}
我必须在此 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 库)将 myCount 值更改为 "Foo":
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"/>
我发现此解决方案适用于更改 "count" 和 "interval" 的内容:
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/@count
改变属性值的语句是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());
}
}