Как обновить XML с помощью XPath и Java - PullRequest
22 голосов
/ 25 мая 2011

У меня есть документ XML и выражение XPath для этого документа. Я должен обновить документ с помощью XPath во время выполнения.

Как я могу сделать это с помощью Java?

Ниже мой 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>

Я должен изменить значения имени и возраста в //PersonList/Person[2]/Name.

Ответы [ 7 ]

26 голосов
/ 25 мая 2011

Используйте setNodeValue. Сначала получите NodeList, например:

myNodeList = (NodeList) xpath.compile("//MyXPath/text()")
           .evaluate(myXmlDoc, XPathConstants.NODESET);

Затем установите значение, например, первый узел:

myNodeList.item(0).setNodeValue("Hi mom!");

Дополнительные примеры, например здесь .

Как уже упоминалось в двух других ответах здесь, а также в вашем предыдущем вопросе : технически XPath - это не способ «обновить» документ XML, а только найти узлы в документе XML. Но я полагаю, что это то, что вы хотите.

РЕДАКТИРОВАТЬ : отвечая на ваш комментарий ... Вы спрашиваете, как записать вашу DOM в файл XML после того, как вы закончили редактирование DOM? Если это так, вот два примера того, как это сделать:

http://www.java2s.com/Code/Java/XML/WriteDOMout.htm

http://download.oracle.com/javaee/1.4/tutorial/doc/JAXPXSLT4.html

4 голосов
/ 21 сентября 2015

Вы можете удалить файл и создать новый.

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")));
3 голосов
/ 25 мая 2011

XPath может использоваться для выбора узлов в документе, но не для модификации

Вы применяете выражение xpath к своему документу и получаете элемент (в вашем случае).Если у вас есть Element, вы можете использовать методы Element для изменения значений (имя и возраст в вашем случае)


Начиная с NodeList, оно должно работать так:

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");
3 голосов
/ 25 мая 2011

XPath используется для выбора частей документа XML. В нем нет условий для обновления.Но так как он возвращает объекты DOM (элементы, если память служит, или, может быть, узлы), вы можете использовать методы DOM для изменения документа.

2 голосов
/ 25 мая 2011

Рассмотрите возможность использования XQuery Update вместо XPath. Это позволяет писать

replace value of node //PersonList/Person[2]/Name with "Anonymous"

Это гораздо проще, чем использовать Java DOM API.

1 голос
/ 28 ноября 2014

Я создал небольшой проект для использования XPATH для создания / обновления XML: https://github.com/shenghai/xmodifier код для изменения вашего xml выглядит так:

Document document = readDocument("personList.xml");
XModifier modifier = new XModifier(document);
modifier.addModify("//PersonList/Person[2]/Name", "newName");
modifier.modify();
0 голосов
/ 01 апреля 2016

Вот код для изменения содержимого: vtd-xml ... vtd-xml уникален тем, что является единственным API, который предлагает возможность инкрементного обновления.

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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...