Сталкиваюсь с проблемой при вложении XML-тегов в java

#java #xml

#java #xml

Вопрос:

Я пытаюсь создать XML-файл на Java, я ожидаю получить следующий результат:

 <Row>
  <customer_name> foo </customer_name>
  <address>
     <street_address> 123 Hemming Way </street_address>
     <city> Brandon </city>
  </address>
  <region> Manitoba </region>
</Row>
  

Результат, который я получаю, не содержит вложенности <address> тега, подобного этому:

 <Row>
   <customer_name> foo </customer_name>
   <street_address> 123 Hemming Way </street_address>
   <city> Brandon </city>
   <region> Manitoba </region>
</Row>
  

Я не знаю, как включить отдельное вложение <address> for street_address и city .
Мой код выглядит следующим образом:

 ResultSet rs = statement.executeQuery("Select  customer_name,street_address,city, region  from customers ");
ResultSetMetaData rsmd = rs.getMetaData();
int colCount = rsmd.getColumnCount();

while (rs.next()) {
    Element row = doc.createElement("Row");
    results.appendChild(row);
    for (int i = 1; i <= colCount; i  ) {
        String columnName = rsmd.getColumnLabel(i);
        Object value = rs.getObject(i);
        Element node = doc.createElement(columnName);
        node.appendChild(doc.createTextNode(value.toString()));
        row.appendChild(node);
    }
}
  

Ответ №1:

Вы не сможете, если напишете только общий цикл для всех столбцов. Вам нужно написать более явный код, чтобы street_address и city были вложены внутри address тега.

Я бы посоветовал вам исключить цикл столбцов и написать конкретный код для каждого столбца.

Вспомогательные методы могут быть хорошей идеей:

 static Element addElement(Element parent, String name) {
    Element elem = parent.getOwnerDocument().createElement(name);
    parent.appendChild(elem);
    return elem;
}

static void addElementValue(Element parent, String name, String value) {
    addElement(parent, name).appendChild(parent.getOwnerDocument().createTextNode(value));
}
  

Теперь проще писать логику:

 while (rs.next()) {
    Element row = addElement(results, "Row");
    addElementValue(row, "customer_name", rs.getString("customer_name"));
    Element address = addElement(row, "address");
    addElementValue(address, "street_address", rs.getString("street_address"));
    addElementValue(address, "city", rs.getString("city"));
    addElementValue(row, "region", rs.getString("region"));
}
  

Это также упрощает для вас определение имен элементов, если вы того пожелаете, например

 while (rs.next()) {
    Element row = addElement(results, "Customer");
    addElementValue(row, "Name", rs.getString("customer_name"));
    Element address = addElement(row, "Address");
    addElementValue(address, "Street", rs.getString("street_address"));
    addElementValue(address, "City", rs.getString("city"));
    addElementValue(row, "Region", rs.getString("region"));
}
  

чтобы создать следующий XML:

 <Customer>
    <Name>foo</Name>
    <Address>
        <Street>123 Hemming Way</Street>
        <City>Brandon</City>
    </Address>
    <Region>Manitoba</Region>
</Customer>
  

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

1. Спасибо, но как мне зациклить этот код внутри цикла for

2. @sith Внутри какого цикла for? Посмотрите на код еще раз. Это замена всего while (rs.next()) цикла.

3. о’кей, внутри цикла while есть цикл for.

4. @sith Пожалуйста, прочтите ответ . Я сказал: «Я бы посоветовал вам исключить цикл столбцов » . «цикл столбца» == «для цикла»

5. Это так любезно с вашей стороны. Я проверю и дам вам знать, работает ли это 🙂