2017-04-27 112 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