2017-04-27 22 views
2

私は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(); 
    } 

をしかし、私はこの結果を取得するには、どのようなIされていない私は、Javaプログラムを使用して、このXMLファイルの一部を変更する必要が 欲しい:

<?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

読みます。プロパティ名は小文字で始まるはずです。 – Jens

+0

これを修正するつもりです。 – mpv1504

答えて

1

DOMノードが要素ノード以外である可能性があります。私。 <Entree><Word1>の間の空白の場合は、TextNodeが作成されます。 NodeListを通過し、ノード名またはノードタイプを確認する必要があります。

コード例では、両方の例を見ることができます。このコードは少し構造化されていないことに注意してください。制作品質のコードでは、少しリファクタリングしたいかもしれません。それはもう少し直感的に処理するアドホックXMLを作るため

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++]); 
    } 
} 

また、あなたはXPathを使用して検討するかもしれません。

+0

ありがとうございました!確かに、私は空白もノードであるかもしれません。結果は今正しいです。 – mpv1504

2

すでに示唆したように、ドームノードは任意のタイプでよい。 getElementsByTagNameメソッドを使用してそのことを確認できます。

例えば:Javaの命名規則について

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

関連する問題