谢谢! 我感兴趣如何在 xml 中解析并插入新节点。例如我们有
<UserCards>
<UserCard userCardId="ADC">
<userName>nameONE</userName>
<userSurname>surnameONE</userSurname>
<userAge>25</userAge>
<userAdress>adressONE</userAdress>
<userPhone>297718535</userPhone>
</UserCard>
<UserCard userCardId="AC6">
<userName>nameTWO</userName>
<userSurname>surnameTWO</userSurname>
<userAge>17</userAge>
<userAdress>adressTWO</userAdress>
<userPhone>557778899</userPhone>
</UserCard>
</UserCards>
我们需要解析它并找到具有 'userPhone' == 557778899 的用户,并将 newNode 插入到这张卡中并获取
</UserCard>
<UserCard userCardId="AC6">
<userName>nameTWO</userName>
<userSurname>surnameTWO</userSurname>
<userAge>17</userAge>
<userAdress>adressTWO</userAdress>
<userPhone>557778899</userPhone>
<newNode>value</newNode>
</UserCard>
我试图这样做,但什么也没得到
File fXmlFile = new File("Test/UserCards.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
Element root = doc.getDocumentElement();
NodeList nList = doc.getElementsByTagName("UserCard");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node node = nList.item(temp);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) node;
//here im trying to find userPhone == 557778899
if (userPhone.equals(eElement.getElementsByTagName("userPhone").item(0).getTextContent())) {
//this part does not work it was one of my try
NodeList nl = doc.getElementsByTagName("UserCards");
Element newNode= doc.createElement("newNode");
newNode.appendChild(doc.createTextNode("hello"));
eElement.appendChild(newNode);
最佳答案
首先,使用xpath找到你的节点。您使用 createElement 的方法是正确的,但您可以只使用 setTextContent。这是一个完整的例子。另外,我可以很好地打印您的 XML —— 因为我可以。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
public class Example {
public static void main(String... args) throws Exception {
FileInputStream fileInputStream = new FileInputStream("UserCards.xml");
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(fileInputStream);
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
Node node = (Node) xPath
.evaluate("//UserCard[userPhone/text()='557778899']", document.getDocumentElement(), XPathConstants.NODE);
Node newNode = node.appendChild(document.createElement("newNode"));
newNode.setTextContent("value");
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.transform(new DOMSource(document),
new StreamResult(new OutputStreamWriter(new FileOutputStream("UserCards2.xml"), "UTF-8")));
}
}
关于java - 如何在现有的 xml 文件中插入新节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32715796/