2017-01-04 6 views
3

ich den Wert zu setzen haben „count“ in diesem xml:ändern xml Attributwert mit XPath mit VTD-xml Java

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

ich möchte mit einem Mycount Wert mit „Foo“ ändern Code wie diese (VTDXML Bibliothek):

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

Auf diese Weise erhalte ich stattdessen

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

, die nicht mein Ziel ist es, weil das, was ich will, ist

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

Antwort

2

ich diese Lösung gefunden sowohl zum Ändern des Inhalts von "count" angewendet und "Intervall":

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

und das Ergebnis ist:

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

I verwendet Methode insertAttribute, die meine Zeichenfolge an den Namen des Knotens (trigger) anfügt.

Ich weiß, das ist eine schreckliche Lösung, aber es funktioniert gut.

+1

Ihr Xpath ist seltsam .. warum nicht einfach verwenden/Task/Trigger? –

+0

Weil ich xmlns im Task-Tag habe, und dies ist die einzige Möglichkeit, dieses Ziel zu erreichen ... vielleicht gibt es andere Lösungen, aber wie ich in dem früheren Kommentar gesagt habe, werde ich am Montag auf dem richtigen Computer sein Ich werde alles erklären. Vielen Dank vtd-xml-author, deine Arbeit ist sehr, sehr nett. – FDC

0

Ihre XPath sollte/Aufgabe/Trigger/@ count

die Aussage für attr Wertänderung ist xmlModifier.updateToken (i + 1)

Unten finden Sie eine Probe ohne Namespaces zurückgreifen ...

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()); 
    } 
} 
+0

Ich habe diese Lösung versucht, aber ich hatte einen Fehler. Jetzt bin ich nicht auf dem PC, wo ich meine Entwicklung habe, werde ich während nächsten Montag genauer sein, danke. – FDC

+0

Sie können die Namespace Awareness deaktivieren ... das wird funktionieren –

+0

Ich muss Namespaces Informationen halten, das sind Wso2 esb Konfiguration Xml, so kann ich sie nicht ausschalten. Ich habe versucht mit updateToken (i + 1, "myCount"), aber es funktioniert nicht, Trigger-Tag bleibt leer – FDC

Verwandte Themen