Изменение значения тега xml - PullRequest
0 голосов
/ 10 июня 2011

У меня есть документ org.w3c.dom.Document, и я хочу заменить значение определенного тега в xml. Я попытался выполнить следующее, но каким-то образом это не работает. Это не дает ошибку, но я не вижу изменения в значении .

org.w3c.dom.Document

public boolean SetTextInTag(Document doc, String tag, String nodeValue)
    {
        Node node = getFirstNode(doc, tag);
        if( node != null){
            node.setNodeValue(nodeValue);
            return true;
           }
         return false;
   }

EG

 <mytag> this value is to be changed </mytag>

Я хочу, чтобы значение тега было привязано к nodeValue. Мой код не выдает никакой ошибки, но я не вижу изменения в значении.

Ответы [ 4 ]

4 голосов
/ 10 июня 2011

Попробуйте node.setTextContent(nodeValue) вместо node.setNodeValue(nodeValue).

2 голосов
/ 10 июня 2011

Использование setNodeValue на узле для изменения его значения будет работать, но только если это текстовый узел.По всей вероятности, метод setNodeValue был вызван на узле, который не был текстовым узлом.В действительности, ваш код может модифицировать узел Element и, следовательно, не иметь никакого результата.

Чтобы объяснить это далее, ваш документ:

<mytag> this value is to be changed </mytag>

фактически рассматривается синтаксическим анализатором как:

Element (name = mytag, value = null)
  - TextNode (name = #text, value= " this value is to be changed ")

Узлы элемента всегда будут иметь значение null, поэтому установка значения для них не изменит значение дочернего текстового узла.Использование setTextContent, как предложено в одном из ответов, будет работать, поскольку оно изменяет значение TextNode вместо Element.

Вы также можете использовать setNodeValue для изменения значения, но только после обнаружения, если узел являетсяTextNode:

if (node != null && node.getNodeType() == Node.TEXT_NODE) {
    node.setNodeValue(nodeValue);
    return true;
}
1 голос
/ 10 июня 2011

Вам нужно записать xml-файл, чтобы увидеть изменения. Вы делаете это?

Значение узла не обязательно то, что вы думаете. Посмотрите на таблицу здесь: Документация

Возможно, вам лучше использовать функцию replaceChild для ваших целей. Это

Node newChild = document.createTextNode("My new value");
Node oldChild = // Get the child you want to replace...
replaceChild(newChild, oldChild);

Помните, что вы пытаетесь заменить текстовый узел, который является потомком тега, который вы только что искали. Скорее всего, Node oldChild = node.getFirstChild; это то, что вы ищете.

0 голосов
/ 10 июня 2011

Посмотрите на этот код ... Может помочь вам.

<folks>
<person>
    <name>Sam Spade</name>
    <email>samspade@website.com</email>
</person>
<person>
    <name>Sam Diamond</name>
    <email>samdiamond@website.com</email>
</person>
<person>
    <name>Sam Sonite</name>
    <email>samsonite@website.com</email>
</person>
</folks>

Вот код для анализа и обновления значения узла ...

public void changeContent(Document doc,String newname,String newemail) {
Element root = doc.getDocumentElement();
NodeList rootlist = root.getChildNodes();
for(int i=0; i<rootlist.getLength(); i++) {
    Element person = (Element)rootlist.item(i);
    NodeList personlist = person.getChildNodes();
    Element name = (Element)personlist.item(0);
    NodeList namelist = name.getChildNodes();
    Text nametext = (Text)namelist.item(0);
    String oldname = nametext.getData();
    if(oldname.equals(newname)) {
        Element email = (Element)personlist.item(1);
        NodeList emaillist = email.getChildNodes();
        Text emailtext = (Text)emaillist.item(0);
        emailtext.setData(newemail);
    }
} 
}
...