Синтаксический анализ и изменение вложенных XML-файлов в Java

#java #dom #xml-parsing

#java #dom #xml-синтаксический анализ

Вопрос:

У меня следующий формат файла XML, и я должен добавить еще один тег car с номером id, который следует за предыдущим (в данном случае 3):

 <vehicles>
     <cars>
         <car id="1">
             <name>ferrari</name>
         </car>
         <car id="2">
             <name>lamborgini</name>
         </car>
     </cars>
</vehicles>
  

Я уже нашел решение для добавления другого элемента, и оно выглядит следующим образом:

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

        NodeList nList = doc.getElementsByTagName("car");
        Element car= doc.createElement("car");
        car.setAttribute("id", "3");
        Element node = doc.createElement("name");
        node.setTextContent("audi");
        car.appendChild(node);
        nList.item(0).getParentNode().appendChild(car);

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(inputFile);
        transformer.transform(source, result);

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

Теперь у меня есть три проблемы:

  • как добавить новый «car» с правильным идентификатором в конец (не жестко закодированный) с помощью самого простого возможного решения
  • форматирование (не так важно): как включить элементы с тем же форматированием, что и существующие (табуляции, пробелы)
  • как проверить, существует ли тег «cars» уже

Спасибо!

Ответ №1:

Поскольку у вас уже есть все узлы car в виде списка в nList, просмотрите список из последнего элемента.

Как только вы найдете узел типа Element, остановите его. Получите значение атрибута id для этого узла.

Ваш следующий идентификатор узла будет равен 1 от вашего вновь найденного значения id

Комментарии:

1. Как я могу просмотреть список из последнего элемента?