#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. Это так любезно с вашей стороны. Я проверю и дам вам знать, работает ли это 🙂