gpt4 book ai didi

java - 当我们有复杂的层次结构时,如何解析 XML 并更新它?

转载 作者:行者123 更新时间:2023-12-02 05:22:40 33 4
gpt4 key购买 nike

假设我有以下 XML 文件内容

<CREDENTIALS>
<SCENERIOONE>
<USERNAME>stackoverflow</USERNAME>
<PASSWORD>argmishra</PASSWORD>
</SCENERIOONE>
<SCENERIOTWO>
<USERNAME>stackexchnage</USERNAME>
<PASSWORD>mishraarg</PASSWORD>
</SCENERIOTWO>
</CREDENTIALS>

我想检索 SCENERIOONE 的数据(用户名和密码)并检查它并根据需要更新它,对于 SCENERIOTWO 也类似。

如果我用 SCENERIOONE 替换 SCENERIOTWO,即 CREDENTIALS 的子节点相同,我就能够检索数据。

但如果一个父节点的子节点不同,则无法检索。

编辑:

现在我可以通过传递场景来从 XML 检索数据:-

try {
File file = new File("D://DemoWorkSpace//XMLDemo//lib//MyXMLFile.xml");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(file);
doc.getDocumentElement().normalize();
System.out.println("Root element " + doc.getDocumentElement().getNodeName());
NodeList nodeLst = doc.getElementsByTagName("MEMBER_BENEFITS");
System.out.println("Information of all employees");

for (int s = 0; s < nodeLst.getLength(); s++) {

Node fstNode = nodeLst.item(s);

if (fstNode.getNodeType() == Node.ELEMENT_NODE) {
Element fstElmnt = (Element) fstNode;
NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("USERNAME");
Element fstNmElmnt = (Element) fstNmElmntLst.item(0);
NodeList fstNm = fstNmElmnt.getChildNodes();
System.out.println("User Name : " + ((Node) fstNm.item(0)).getNodeValue());
NodeList lstNmElmntLst = fstElmnt.getElementsByTagName("PASSWORD");
Element lstNmElmnt = (Element) lstNmElmntLst.item(0);
NodeList lstNm = lstNmElmnt.getChildNodes();
System.out.println("Password : " + ((Node) lstNm.item(0)).getNodeValue());
}

}
} catch (Exception e) {
e.printStackTrace();
}

但我不知道如何更新XML文件?

最佳答案

如果我理解正确的话,您真正想要的是用户名/密码节点,无论它们在文档中的位置......

您可以使用XPath来查询文档以返回您想要的内容,例如...

try (InputStream is = TestXML.class.getResourceAsStream("/Credentials.xml")){

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document dom = db.parse(is);
XPath xpath = XPathFactory.newInstance().newXPath();

XPathExpression xExpress = xpath.compile("//*[USERNAME and PASSWORD]/*");
NodeList nodeList = (NodeList) xExpress.evaluate(dom, XPathConstants.NODESET);
for (int index = 0; index < nodeList.getLength(); index++) {

Node node = nodeList.item(index);
System.out.println(node.getNodeName());

}

} catch (Exception exp) {
exp.printStackTrace();
}

将输出...

USERNAME
PASSWORD
USERNAME
PASSWORD

如果它很重要,您可以使用Nodeparent属性来查找父节点,显然,getTextContent来获取节点文本内容

您可以根据需要像平常一样操作节点

已更新

因此,根据评论,您应该能够做类似的事情......

try {

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document dom = db.parse(new File("Credentials.xml"));
XPath xpath = XPathFactory.newInstance().newXPath();

String scenerio = "SCENERIOONE";

XPathExpression xExpress = xpath.compile("/CREDENTIALS/" + scenerio + "/[USERNAME and PASSWORD]/*");
NodeList nodeList = (NodeList) xExpress.evaluate(dom, XPathConstants.NODESET);
for (int index = 0; index < nodeList.getLength(); index++) {

Node node = nodeList.item(index);
System.out.println(node.getNodeName());

}

} catch (Exception exp) {
exp.printStackTrace();
}

这将返回 SCENERIOONEUSERNAMEPASSWORD 节点

您可以使用node.get/setTextContent正常获取/设置文本。

当你需要时,你可以使用类似......的东西

Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.setOutputProperty(OutputKeys.METHOD, "xml");
tf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
StreamResult result = new StreamResult(new File("Credentials.xml"));
tf.transform(dom, result);

保存它...

关于java - 当我们有复杂的层次结构时,如何解析 XML 并更新它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26374605/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com