2011-01-13 12 views
16

Mam następujący kod:Problemy ustawienie nowej wartości węzła w Javie, Dom, analizowania XML

DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder(); 
StringReader reader = new StringReader(s); 
InputSource inputSource = new InputSource(reader); 
Document doc_ = dBuilder.parse(inputSource); 

a następnie chciałbym, aby utworzyć nowy element w tym węźle tuż pod węzła głównego z tym kodem :

Node node = doc_.createElement("New_Node"); 
node.setNodeValue("New_Node_value"); 
doc_.getDocumentElement().appendChild(node); 

Problem polega na tym, że węzeł zostaje utworzony i dołączony, ale wartość nie jest ustawiona. Nie wiem, czy po prostu nie widzę wartości, gdy patrzę na mój xml, jeśli jest ukryty w jakiś sposób, ale nie sądzę, że tak jest, ponieważ próbowałem uzyskać wartość węzła po wywołaniu węzła tworzenia i zwraca null. Jestem nowy w xml i dom i nie wiem, gdzie jest przechowywana wartość nowego węzła. Czy to jest jak atrybut?

<New_Node value="New_Node_value" /> 

lub robi to umieścić wartość tutaj:

<New_Node> New_Node_value </New_Node> 

Każda pomoc będzie mile widziana,

Dzięki, Josh

+0

Piszesz nowy DOM z powrotem do pliku? Nie widzę żadnego odniesienia do pisania, a ty powołujesz się na xml. –

+0

@ RD01 - Tak, piszę to z powrotem do pliku. Domyślam się, że moje główne pytanie na tym etapie brzmi: co robi node.setNodeValue(), jeśli nie ustawia tekstu lub atrybutu? – Grammin

Odpowiedz

35

następującego kodu:

Element node = doc_.createElement("New_Node"); 
node.setTextContent("This is the content"); //adds content 
node.setAttribute("attrib", "attrib_value"); //adds an attribute 

produkuje:

<New_Node attrib="attrib_value">This is the content</New_Node> 

nadzieję, że to wyjaśnia.

+0

Ah, który wyjaśnia, więc co robi node.setNodeValue()? – Grammin

+7

'setNodeValue' zmienia się w zależności od typu węzła (Spójrz na tabelę w javadocs: http://download.oracle.com/javase/6/docs/api/org/w3c/dom/Node.html). Jeśli węzeł jest "Elementem", ustawienie nodeValue nic nie robi, ponieważ nodeValue ma wartość 'null'. – dogbane

+0

Dziękujemy za wyjaśnienia! – Grammin

0
<New_Node value="New_Node_value" /> 

'wartość' jest atrybutem

New_Node

elementem, do dostania się do DOM Proponuję http://www.w3schools.com/htmldom/default.asp

+0

Wiem, że w tej instancji wartość jest atrybutem, ale nie wiem, jaka jest wartość, gdy ustawięNodeValue i dlaczego kod, który próbuję, nie działa. – Grammin

1

Dla wyjaśnienia, podczas tworzenia węzłów używać:

Attr x = doc.createAttribute(...); 
Comment x = doc.createComment(...); 
Element x = doc.createElement(...); // as @dogbane pointed out 
Text x = doc.createTextNode(...); 

zamiast używania rodzajowe węzła do czego wracać z każdej metody. Ułatwi to czytanie/debugowanie kodu.

Po drugie, metody getNodeValue()/setNodeValue() działają inaczej w zależności od rodzaju węzła, który posiadasz. Zobacz podsumowanie Node class w celach informacyjnych. W przypadku elementu nie można korzystać z tych metod, chociaż w przypadku węzła Tekst można.

Jak zauważył @dogbane, należy użyć setTextContent() dla tekstu między znacznikami tego elementu. Zauważ, że to zniszczy wszelkie istniejące elementy podrzędne.

0

To jest inne rozwiązanie, w moim przypadku to rozwiązanie działa, ponieważ funkcja setTextContent() nie istnieje. Pracuję z Google Web Toolkit (GWT) (Jest to framework programistyczny Java) i jestem zaimportowany do biblioteki XMLParser, ponieważ mogę używać DOM Parser.

import com.google.gwt.xml.client.XMLParser;

Dokument doc = XMLParser.createDocument();

Węzeł elementu = doc.createElement ("New_Node"); node.appendChild (doc.createTextNode ("value"));

doc.appendChild (węzeł);

Wynikiem jest:

< New_Node> wartość < /New_Node>

Powiązane problemy