2016-03-21 12 views
0

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

+1

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ı

  • Sorun kullanarak öğrenin. Her seferinde "child1" etiket adıyla çalıştığınız araçlar. – f1sh

  • +0

    I endeksi 1'de başladım, çünkü "loopThroughLists" –

    +0

    '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

    cevap

    0

    yılında

    teşekkürler Bir lexer- ve ayrıştırıcı jeneratör ile bir çözüm uygulayabilirsiniz.

    Son zamanlarda bu yönde jflex ve CUP ile bir şey yaptım.

    Avantaj:

    • hata algılama
    • , giriş ve çıkış
    • O (IMHO)

    aleyhte bir tipik derleyici sorundur uzanabilir

  • :

    • Derleyici inşasını öğrenin
  • İlgili konular