我是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 :(得分: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处理更加直观。