2 listeye sahibim, hangi boyutlar eşittir. İlk liste, üretilmesi gereken tüm xml etiket adlarını içerir ve ikincisi girintilerini içerir (daha iyi bir kelime bulamadı). Girinti örneğin: Kök öğesinin girintisi 0, çocuklarının 1'i vb. Vardır.Sadece etiket adını ve girintisini bilerek xml üretin (açıklanırken açıklanır) - Java
Daha iyi bir örnek:
XML TAGS | INDENT
root | 0
child1 | 1
child12 | 2
child2 | 1
child22 | 2
XML Örnek:
<root>
<child1>
<child12></child12>
</child1>
<child2>
<child22></child22>
</child2>
</root>
Benim yaklaşım: I (girinti dayalı benim xml oluşturmak için özyineleme kullanmaya çalışıyorum
private static void generateXML() throws ParserConfigurationException, TransformerException {
if (xmlNames.size() == indentationNumbers.size()) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
// root element
Element root = document.createElement(xmlNames.get(0));
document.appendChild(root);
int lastKnownIndentation = Integer.parseInt(indentationNumbers.get(0));
loopThroughLists(document, lastKnownIndentation, root);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);
} else {
// TODO Logger + Exception
}
}
private static void loopThroughLists(Document document, int lastKnownIndentation, Element root) {
for (int i = 1; i < xmlNames.size(); i++) {
String xmlName = xmlNames.get(i);
int indentaion = Integer.parseInt(indentationNumbers.get(i));
Element element = null;
if (xmlName.startsWith("@")) {
continue;
}
if (indentaion == lastKnownIndentation + 1) {
element = document.createElement(xmlName);
root.appendChild(element);
} else {
loopThroughLists(document, indentaion, element);
}
}
}
Önceden açıklandığı gibi), ama her zaman ne anlama geldiğini bildiğim bir StackOverflowError alıyorum ve biliyorum ben döngü ba d listelerinden. Daha iyi bir yaklaşımla bana yardımcı olabilir misiniz? peşin
mümkün bu çözümü Her zaman '' loopThroughLists'' fonksiyonunda dizin 1'de döngü başlatmak yapmak için çok küçük olabilir yeni araçları
I endeksi 1'de başladım, çünkü "loopThroughLists" –
'dan önce dizin 0'da olan root elementimi oluşturdum ve 0'da başlatmamaya başladım. Fonksiyonunuzu her defasında tekrar tekrar aradığınızda satın al, tekrar 1'den başlıyorsun Bir sonraki etikete başlamak yerine. – f1sh