使用Java编辑XML文件

时间:2017-04-27 08:03:03

标签: 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代码中修改什么才能获得此功能?

2 个答案:

答案 0 :(得分:2)

如前所述,Dom Node可以是任何类型。您可以使用getElementsByTagName方法来确保这一点。

E.g:

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

答案 1 :(得分:1)

诀窍是DOM节点可以不是元素节点。即对于.htaccess<Entree>之间的空格,它会创建<Word1>。您需要浏览TextNode并检查节点名称或节点类型。

在代码示例中,您可以看到两者的示例。请注意,此代码有点非结构化。对于生产质量代码,您可能需要稍微重构一下。

NodeList

或者,您可以考虑使用XPath,因为这会使ad-hoc XML处理更加直观。