2017-04-27 129 views
2

我是Java和XML的新手。 我需要使用Java程序來修改這個XML文件的一部分:用Java編輯XML文件

<?xml version="1.0" encoding="UTF-8"?> 
<Traduction> 
    <Entrée> 
    <Word1>Word1</Word1> 
    <N1>0</N1> 
    <N2>0</N2> 
    <Word2>Word2</Word2> 
    </Entrée> 
    <Sortie> 
    <Word1>Word1</Word1> 
    <N1>0</N1> 
    <N2>0</N2> 
    <Word2>Word2</Word2> 
    </Sortie> 
</Traduction> 

我想利用這個代碼在Eclipse:

try { 
    String filepath = "/home/user/Trad/ex1.xml"; 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document document = builder.parse(filepath); 

    Node Traduction = document.getChildNodes().item(0); 
    Node Sortie = Traduction.getChildNodes().item(1); 

    Sortie.getChildNodes().item(0).setTextContent("AAA"); 
    Sortie.getChildNodes().item(1).setTextContent("001"); 
    Sortie.getChildNodes().item(2).setTextContent("002"); 
    Sortie.getChildNodes().item(3).setTextContent("BBB"); 

    TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
    Transformer transformer = transformerFactory.newTransformer(); 
    DOMSource source = new DOMSource(document); 
    StreamResult result = new StreamResult(new File(filepath)); 
    transformer.transform(source, result); 
} 

catch (ParserConfigurationException pce) { 
    pce.printStackTrace(); 
    } 
catch (TransformerException tfe) { 
    tfe.printStackTrace(); 
    } 
catch (IOException ioe) { 
    ioe.printStackTrace(); 
    } 
catch (SAXException sae) { 
    sae.printStackTrace(); 
    } 

但我得到這樣的結果,這不是我想:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><Traduction> 
    <Entrée>AAA<Word1>001</Word1>002<N1>BBB</N1> 
    <N2>0</N2> 
    <Word2>Word2</Word2> 
    </Entrée> 
    <Sortie> 
    <Word1>Word1</Word1> 
    <N1>0</N1> 
    <N2>0</N2> 
    <Word2>Word2</Word2> 
    </Sortie> 
</Traduction> 

我想獲得:

<?xml version="1.0" encoding="UTF-8"?> 
<Traduction> 
    <Entrée> 
    <Word1>Word1</Word1> 
    <N1>0</N1> 
    <N2>0</N2> 
    <Word2>Word2</Word2> 
    </Entrée> 
    <Sortie> 
    <Word1>AAA</Word1> 
    <N1>001</N1> 
    <N2>002</N2> 
    <Word2>BBB</Word2> 
    </Sortie> 
</Traduction> 

我應該在Java代碼中修改哪些內容才能獲得此內容?

+0

讀關於Java命名約定。屬性名稱應該以小寫字符開頭 – Jens

+0

好吧,我要解決這個問題。 – mpv1504

回答

1

訣竅是DOM節點可以不是元素節點。即對於<Entree><Word1>之間的空格,它會創建一個TextNode。您需要通過NodeList並檢查節點名稱或節點類型。

在代碼示例中,您可以看到兩個示例。請注意,這段代碼有點沒有結構化。對於生產質量代碼,您可能需要對其進行一些重構。

Node Traduction = document.getChildNodes().item(0); 
NodeList traductionChildNodes = Traduction.getChildNodes(); 
Node Sortie = null; 
for (int i = 0; i < traductionChildNodes.getLength(); i++) { 
    Node node = traductionChildNodes.item(i); 
    // here we check the node name 
    if ("Sortie".equals(node.getNodeName())) { 
     Sortie = node; 
     break; 
    } 
} 

NodeList sortieChildNodes = Sortie.getChildNodes(); 
// we got the texts in an array so we can access them one after another 
String[] texts = new String[] {"AAA", "001", "002", "BBB"}; 
// i is for the nodes, j is for the 
for (int nodeIndex = 0, textIndex = 0; nodeIndex < sortieChildNodes.getLength(); nodeIndex++) { 
    Node node = sortieChildNodes.item(nodeIndex); 
    // here we check the node type 
    if (node.getNodeType() == Node.ELEMENT_NODE) { 
     node.setTextContent(texts[textIndex++]); 
    } 
} 

或者,你可能會因爲這使得特設XML處理更直觀一點考慮使用XPath

+0

謝謝!的確,我不知道空白區也可能是節點。現在結果是正確的。 – mpv1504

2

如前所述,Dom節點可以是任何類型。您可以使用getElementsByTagName方法來確定。

例如爲:

try { 
      String filepath = "/home/user/Trad/ex1.xml"; 
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder builder = factory.newDocumentBuilder(); 
      Document document = builder.parse(filepath); 

      Element sortie = (Element) document.getElementsByTagName("Sortie").item(0); 

      sortie.getElementsByTagName("Word1").item(0).setTextContent("AAA"); 
      sortie.getElementsByTagName("N1").item(0).setTextContent("001"); 
      sortie.getElementsByTagName("N2").item(0).setTextContent("002"); 
      sortie.getElementsByTagName("Word2").item(0).setTextContent("BBB"); 

      TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
      Transformer transformer = transformerFactory.newTransformer(); 
      DOMSource source = new DOMSource(document); 
      StreamResult result = new StreamResult(new File(filepath)); 
      transformer.transform(source, result); 
     } 

     catch (ParserConfigurationException pce) { 
      pce.printStackTrace(); 
     } catch (TransformerException tfe) { 
      tfe.printStackTrace(); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } catch (SAXException sae) { 
      sae.printStackTrace(); 
     } 
+0

謝謝。第一視圖似乎是最簡單的解決方案。 – mpv1504