【问题标题】:trying to update the same XML file with a new XML nodes using the tag name尝试使用标签名称使用新的 XML 节点更新相同的 XML 文件
【发布时间】:2020-05-29 10:48:00
【问题描述】:

我正在创建一个简单的 java 函数来更新/重写 xml 文件的值。 我可以从系统资源中选择 XML 文件,在更新文件并重写后,节点的值永远不会改变。

这是我的 sn-ps:

String filePath = ABS_PATH + File.separator + "fields.xml";

File xmlFile = new File(filePath);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
try {
    dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(xmlFile);
    doc.getDocumentElement().normalize();

    //update Element value
    updateElementValue(doc);

    //write the updated document to file or console
    doc.getDocumentElement().normalize();
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();

    DOMSource source = new DOMSource(doc);
    StreamResult result = new StreamResult(new File(ABS_PATH
                 + File.separator + "fields.xml")); // updating/re-writing the same file
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.transform(source, result);
    System.out.println("XML file updated successfully");

} catch (SAXException | ParserConfigurationException | IOException | TransformerException e1) {
    e1.printStackTrace();
}

//method to show the update element value
private static void updateElementValue(Document doc) {
    NodeList employees = doc.getElementsByTagName("NO");
    Element emp = null;
    //loop for each
    for (int i = 0; i < employees.getLength(); i++) {
        emp = (Element)employees.item(i);
        Node name = emp.getElementsByTagName("String").item(0).getFirstChild();
        name.setNodeValue(name.getNodeValue().toUpperCase());
    }

}

xml 文件示例

  <Document xmlns="http://hello.com/schema/public/services/platform" Id="1">
  <Fields>
    <Field FieldName="NO">
      <String>Demo</String>
    </Field>
    <Field FieldName="TYPE">
      <String>Zada</String>
    </Field>
  </Fields> 

谁有足够的动力去提供帮助

【问题讨论】:

  • NodeList employees = doc.getElementsByTagName("NO"); 将返回一个空列表,因为您没有带有 tag “NO”的元素。
  • 请回答
  • 随心所欲发布。

标签: java xml


【解决方案1】:

你有以下陈述:

 NodeList employees = doc.getElementsByTagName("NO");

它将返回一个空列表,因为您的 XML 没有任何带有“NO”作为标记的节点。

 <Field FieldName="NO">

循环中遍历列表的语句永远不会被执行。您的节点将不会更新。

标签为Field 的元素具有FieldName 属性。其中之一的属性值为“NO”。所以你需要找到它。

看看How to get specific XML elements with specific attribute value?是否给了你足够的指导。

你也可以用循环来做到这一点。

NodeList employees = doc.getElementsByTagName("Field");
for (int i = 0; i < employees.getLength(); i++) {
     emp = (Element)employees.item(i);
     if ("NO".equals(emp.item(i).getAttribute("FieldName"))) {
           // do your stuff
     }
}

以上内容未经测试。

【讨论】:

  • 谢谢,但是我如何得到这个 - FieldName="NO" 来得到这个值 - 演示并更新它。谢谢
  • 更新了我的答案。
  • 你熟悉XPATH吗?
  • 嗯.. 要么你自己熟悉一下,要么使用像 JSOUP. 这样的库。
  • 我按照本教程进行操作,因为它与我的结构相同,但没有进展journaldev.com/901/modify-xml-file-in-java-dom-parser
猜你喜欢
  • 2014-07-01
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2011-06-12
  • 1970-01-01
相关资源
最近更新 更多