J'ai un document XML et une expression XPath pour ce document. Je dois mettre à jour le document en utilisant XPath au moment de l'exécution.
Comment puis-je faire cela en utilisant Java?
Le ci-dessous est mon xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<PersonList>
<Person>
<Name>Sonu Kapoor</Name>
<Age>24</Age>
<Gender>M</Gender>
<PostalCode>54879</PostalCode>
</Person>
<Person>
<Name>Jasmin</Name>
<Age>28</Age>
<Gender>F</Gender>
<PostalCode>78745</PostalCode>
</Person>
<Person>
<Name>Josef</Name>
<Age>232</Age>
<Gender>F</Gender>
<PostalCode>53454</PostalCode>
</Person>
</PersonList>
Je dois changer les valeurs de nom et d’âge sous //PersonList/Person[2]/Name
.
Utilisez setNodeValue
. Commencez par obtenir une liste de noeuds, par exemple:
myNodeList = (NodeList) xpath.compile("//MyXPath/text()")
.evaluate(myXmlDoc, XPathConstants.NODESET);
Puis définissez la valeur de, par exemple. le premier noeud:
myNodeList.item(0).setNodeValue("Hi mom!");
Plus d'exemples, par exemple ici .
Comme mentionné dans deux autres réponses ici, ainsi que dans votre question précédente : techniquement, XPath n’est pas un moyen de "mettre à jour" un document XML, mais uniquement de localiser des nœuds dans un document XML. Mais je suppose que ce qui précède est ce que vous voulez.
EDIT: En réponse à votre commentaire ... Demandez-vous comment écrire votre DOM dans un fichier XML une fois que vous avez fini de l'éditer? Si oui, voici deux exemples de la façon de le faire:
http://www.Java2s.com/Code/Java/XML/WriteDOMout.htm
http://download.Oracle.com/javaee/1.4/tutorial/doc/JAXPXSLT4.html
XPath est utilisé pour sélectionner des parties d'un document XML. Aucune mise à jour n'est possible. Mais comme il retourne des objets DOM (Elements, si la mémoire sert ou peut-être des nœuds), vous pouvez ensuite utiliser des méthodes DOM pour modifier le document.
XPath
peut être utilisé pour sélectionner nœuds dans un document, pas pour modification
Vous appliquez l'expression xpath à votre document et obtenez un élément (dans votre cas). Une fois que vous avez cette Element
, vous pouvez utiliser les méthodes Element
pour modifier les valeurs (nom et âge dans votre cas).
À partir de NodeList
cela devrait fonctionner comme ça:
NodeList nodes = getNodeListFromXPathExpression(); // you know how
if (nodes.length == 0)
return; // empty nodelist, xpath didn't select anything
Node first = node.getItem(0); // take the first from the list, your element
// this is a shortcut for your example:
// first is the actual selected element (a node)
// .getFirst() returns the first child node, the "text node" (="Jasmine", ="28")
// .setNodeValue() replace the actual value of that text node with a new string
first.getFirstChild().setNodeValue("New Name or new age");
Vous pouvez supprimer le fichier et en créer un nouveau.
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
new InputSource("data.xml"));
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList nodes = (NodeList) xpath.evaluate("//employee/name[text()='old']", doc,
XPathConstants.NODESET);
for (int idx = 0; idx < nodes.getLength(); idx++) {
nodes.item(idx).setTextContent("new value");
}
Transformer xformer = TransformerFactory.newInstance().newTransformer();
xformer.transform(new DOMSource(doc), new StreamResult(new File("data_new.xml")));
J'ai créé un petit projet d'utilisation de XPATH pour créer/mettre à jour XML: https://github.com/shenghai/xmodifier Le code pour changer votre xml ressemble à:
Document document = readDocument("personList.xml");
XModifier modifier = new XModifier(document);
modifier.addModify("//PersonList/Person[2]/Name", "newName");
modifier.modify();
Pensez à utiliser XQuery Update au lieu de XPath. Cela vous permet d'écrire
replace value of node //PersonList/Person[2]/Name with "Anonymous"
C'est beaucoup plus facile que d'utiliser l'API Java DOM.
Voici le code permettant de modifier le contenu avec vtd-xml ... vtd-xml est unique en ce sens que c’est la seule API qui offre une fonctionnalité de mise à jour incrémentielle.
import com.ximpleware.*;
import Java.io.*;
public class changeName {
public static void main(String s[]) throws VTDException,Java.io.UnsupportedEncodingException,Java.io.IOException{
VTDGen vg = new VTDGen();
if (!vg.parseFile("input.xml", false))
return;
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
XMLModifier xm = new XMLModifier(vn);
ap.selectXPath("//PersonList/Person[2]");
int i=0;
while((i=ap.evalXPath())!=-1){
if (vn.toElement(VTDNav.FIRST_CHILD,"Name")){
int k=vn.getText();
if (i!=-1)
xm.updateToken(k, "Jonathan");
vn.toElement(VTDNav.PARENT);
}
if (vn.toElement(VTDNav.FIRST_CHILD,"Age")){
int k=vn.getText();
if (i!=-1)
xm.updateToken(k, "42");
vn.toElement(VTDNav.PARENT);
}
}
xm.output("new.xml");
}
}