Дерево в Java для String XML в Java (без классов Node) - PullRequest
0 голосов
/ 13 марта 2012

[Edit] Любой пример алгоритма / кода Java для travserse и построения дерева (не двоичного) также будет полезен

Я пытаюсь создать XML. размеры строк и столбцов являются динамическими из базы данных

(Пример: в этом случае структура имеет вид страна-> штат-> номер проекта. Это также может быть страна-> штат-> отдел-> строительный-номер-> номер-проекта)

Вы можете или не можете использовать методы, которые я написал в классе TestMain. Я предпочитаю не использовать классы org.w3c.dom.Node по некоторым причинам. Но не обязательно. Если вы поможете мне с использованием w3c.dom.Node, я постараюсь конвертировать в соответствии с моими потребностями.

XML должен выглядеть следующим образом.

<root>
  <value name="USA">
      <value name="NY">
        <value name="p1"></value>
        <value name="p2"></value>
        <value name="p3"></value>
        <value name="p4"></value>
      </value>
      <value name="LA">
        <value name="p6"></value>
        <value name="p7"></value>
        <value name="p8"></value>
      </value>      
      ...
      ...
  </value>
</root>



package com;


public class TestMain {

public static void main(String[] args) {
    String[][] dbResult= new String[10][3];
    dbResult[0][0]="USA";dbResult[0][1]="NY";dbResult[0][2]="P1";
    dbResult[1][0]="USA";dbResult[1][1]="NY";dbResult[1][2]="P2";
    dbResult[2][0]="USA";dbResult[2][1]="NY";dbResult[2][2]="P3";
    dbResult[3][0]="USA";dbResult[3][1]="NY";dbResult[3][2]="P4";
    dbResult[4][0]="USA";dbResult[4][1]="LA";dbResult[4][2]="P5";
    dbResult[5][0]="USA";dbResult[5][1]="LA";dbResult[5][2]="P6";
    dbResult[6][0]="USA";dbResult[6][1]="LA";dbResult[6][2]="P7";
    dbResult[7][0]="USA";dbResult[7][1]="OH";dbResult[7][2]="P8";
    dbResult[8][0]="USA";dbResult[8][1]="OH";dbResult[8][2]="P9";
    dbResult[9][0]="USA";dbResult[9][1]="TX";dbResult[9][2]="P10";

            String xmlStr="<root name=\"myName\" style=\"Horizontal\"></root>";
    TestMain.createXml(xmlStr,dbResult);
}

private static void createXml(String xmlStr,String[][] dbResult) {
    int arrayItr =0;
    System.out.println(dbResult.length);
    while(arrayItr<dbResult.length){
        String[] currRow=dbResult[arrayItr++];
        int columnNumber=1;
        for(String currValue:currRow){
            if(arrayItr==1){
                xmlStr = TestMain.insertChild(xmlStr, columnNumber, currValue);
            }else{
                /*if(TestMain.valueOfAttribute(xmlStr, "name").equalsIgnoreCase(currValue)){
                    continue;
                }else{

                }*/
                for(int childNumber=1;childNumber<TestMain.getChildrenCount(xmlStr);childNumber++){
                    TestMain.getChildrenByNum(xmlStr,childNumber);
                }


            }
                columnNumber++;
        }
        //System.out.println();
    }
    System.out.println(xmlStr);

}

private static int getChildrenCount(String xmlStr) {
    char[] chars=xmlStr.toCharArray();
    int counter=0;
    for(int currItr=0;currItr<chars.length;currItr++){
     char currChar=chars[currItr];
        if(currChar=='<' && chars[currItr+1]!='/'){
            counter++;
        }
    }
    return counter-1;
}

private static Object getChildrenByNum(String xmlStr, int childNumber) {
    // TODO Auto-generated method stub
    return null;
}

public static String insertChild(String xmlStr, int position, String valueInsert){
    System.out.println("Entered : insertChild "+xmlStr.length() );

    //xmlStr = xmlStr.substring(xmlStr.indexOf(">")+1,xmlStr.lastIndexOf("<"));
    int index=0;
    for(int counter=0;counter<position;counter++){

        index= xmlStr.indexOf(">",(index+1));
        //index=index+tempIndex+1;
        //System.out.println(xmlStr);
    }
    //System.out.println("Index: "+index);
    String op=xmlStr.substring(0,index+1) +
            "<value name=\""+valueInsert+"\"></value>" +xmlStr.substring(index+1);  

    //System.out.println("output in insChild Method: "+op);
    //xmlStr = insertChild(xmlStr,valueCompare,valueInsert);
    return op;
}
public static int findPositionToInsert(String xmlStr, String valueCompare,int pos){
    //System.out.println("Entered : findPosition");
    if(TestMain.valueOfAttribute(xmlStr, "name").equalsIgnoreCase(valueCompare)){
        return pos;
    }else if(TestMain.hasChildren(xmlStr)){
        pos++;
        xmlStr = xmlStr.substring(xmlStr.indexOf(">")+1,xmlStr.lastIndexOf("<"));
        pos=TestMain.findPositionToInsert(xmlStr, valueCompare,pos);

    }else{
        return -1;
    }
    return pos;
}
public static String valueOfAttribute(String xml,String attributeName){
    String valueOfAttribute=null;
     int index = xml.indexOf(attributeName);
     char c=xml.charAt(index+attributeName.length());
     //System.out.println("C- "+c);
     int i=index+attributeName.length();//i<xml.indexOf(">");i++){
         //if(c=='='){
             String subStr=xml.substring(i+2,xml.length());
             //System.out.println("Input Xml "+xml+" -SubStr "+subStr);
             int secondIndex=subStr.indexOf("\"");
             //System.out.println("sec index "+secondIndex);
             String value=subStr.substring(0,secondIndex);
         //}

     return value;

    //return valueOfAttribute;
}
public static boolean hasChildren(String xml){
    int index = xml.indexOf(">");
    if(xml.charAt(index-1)!='/'){
        String[] splitStr = xml.split(">");
        if(splitStr.length>1){
            return true;
        }
    }

    return false;
}

}

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

возможно, вам следует сделать это с библиотекой JAXB:

, посмотрите пример здесь: http://jaxb.java.net/tutorial/section_1_3-Hello-World.html#Hello%20World

regards

micha

0 голосов
/ 15 марта 2012

Реализовано с использованием примера 3 в http://myarch.com/treeiter/traditways

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...