2 Stimmen

Java: Wie man XML-Knotenpfad bekommt

Ich habe folgendes xml:

 LEVEL_1-Value_1
 LEVEL_1-Value_2

    LEVEL_2-Value_1

            LEVEL_4-Value_1
            LEVEL_4-Value_2
            LEVEL_4-Value_3

        Value_251
        Value_252

       Value_253
       Value_254

        Value_255
        Value_256

        Value_257
        Value_258

Ich muss die Knotenpfade mit dem Wert in Java ausgeben. Hier ist ein Beispielausgang, den ich erhalten muss:

RootNode.Node_11 = LEVEL_1-Value_1
RootNode.Node_12 = LEVEL_1-Value_2
RootNode.Node_13.Node_121 = LEVEL_2-Value_1
RootNode.Node_14.Node_121.Node_1231.Node_12341 = LEVEL_4-Value_1
RootNode.Node_14.Node_121.Node_1231.Node_12342 = LEVEL_4-Value_2
RootNode.Node_14.Node_121.Node_1231.Node_12343 = LEVEL_4-Value_3
RootNode.Node_15.Node_25.Node_251 = Value_251
RootNode.Node_15.Node_25.Node_252 = Value_252
RootNode.Node_15.Node_25.Node_251 = Value_253
RootNode.Node_15.Node_25.Node_252 = Value_254
RootNode.Node_15.Node_25.Node_251 = Value_255
RootNode.Node_15.Node_25.Node_252 = Value_256
RootNode.Node_15.Node_25.Node_251 = Value_257
RootNode.Node_15.Node_25.Node_252 = Value_258

Hier ist mein letzter Java-Code. Ich kann nicht erreichen, dass er richtig funktioniert.

public class Read_XML {
 static String rootTag = "";
 static HashMap valueMap = new HashMap();
 public static void main(String arg[]) throws IOException, AxiomRuntimeException
 {

    File inFile = new File("C:/Test.xml");

    FileReader fr = new FileReader(inFile);
    BufferedReader br = new BufferedReader(fr);

    String sXML = "";
    for (String line; (line = br.readLine())!= null;)
    {
        sXML += line;
    }
    Document doc = XMLStringParser.parseString(sXML);
    Element root = doc.getDocumentElement();
    rootTag += root.getTagName();
    NodeList rootList = doc.getElementsByTagName("RootNode");
    Element rootList_node = (Element) rootList.item(0);
    NodeList kids = rootList_node.getChildNodes();
    for(int i = 0; i < kids.getLength(); i++)
    {
        String nextTag = "";
        if(kids.item(i) instanceof Element)
        {
            nextTag = rootTag + "." + kids.item(i).getNodeName();
            int level = 0;
            processChildNode(kids.item(i).getChildNodes(), nextTag, level);
        }
    }
    Iterator it = valueMap.keySet().iterator();
    for (;it.hasNext();)
    {
        String key = it.next().toString();
        String val = valueMap.get(key).toString();
        System.out.println(key + " = " + val );
    }
}

public static void processChildNode(NodeList listOfNodes, String tags, int level)
{
    String tagPath = tags;
    int curLevel = 0;
    for(int i = 0; i < listOfNodes.getLength(); i++)
    {
        System.out.println("Node Name = " + listOfNodes.item(i).getNodeName());
        if(listOfNodes.item(i) instanceof Element)
        {
            if(curLevel == level + 1)
            {
                tagPath = tags;
            }
            else
            {
                curLevel = level +1;
                tagPath += "." + listOfNodes.item(i).getNodeName();
            }
            if(listOfNodes.item(i).getChildNodes().getLength() >= 1)
            {
                processChildNode(listOfNodes.item(i).getChildNodes(), tagPath, curLevel);
            }

        }
        else if(listOfNodes.item(i) instanceof Text && listOfNodes.getLength() == 1)
        {
            String value = listOfNodes.item(i).getNodeValue();
            valueMap.put(tagPath, value);
        }

    }
 }
}

Hier ist die aktuelle Ausgabe :

RootNode.Node_15.Node_25.Node_251 = Value_251
RootNode.Node_14.Node_121.Node_1231.Node_12341 = LEVEL_4-Value_1
RootNode.Node_12 = LEVEL_1-Value_2
RootNode.Node_15 = Value_258
RootNode.Node_14.Node_121.Node_1231 = LEVEL_4-Value_3
RootNode.Node_15.Node_25 = Value_252
RootNode.Node_11 = LEVEL_1-Value_1
RootNode.Node_15.Node_251 = Value_257
RootNode.Node_13.Node_121 = LEVEL_2-Value_1

Bitte helfen Sie mir, dass es richtig funktioniert. Vielen Dank.

2voto

Arnaud Punkte 6769

Sie haben dieses Problem, weil Sie eine HashMap zum Speichern Ihrer Werte verwenden. Da beispielsweise der Pfad RootNode.Node_15.Node_25.Node_252 mehrmals vorhanden ist, wird der alte Wert gelöscht, wenn Sie einen neuen in die Map setzen.

Sie können Ihre HashMap durch eine List ersetzen, um alle gefundenen Pfade anzuzeigen. Hier ein Beispiel :

static List valueList = new ArrayList();

und Sie fügen die Werte auf diese Weise hinzu :

valueList.add(new String [] {tagPath, value});

Schließlich können Sie Ihre Pfade wie folgt anzeigen :

Iterator it = valueList.iterator();
for (;it.hasNext();) {
    String [] val = it.next();
    System.out.println(val[0] + " = " + val[1] );
}

ÜBERARBEITET

Es gibt auch einen Fehler beim Pfadaufbau, und die Variablen level und curLevel sind nicht notwendig. Hier ist ein funktionierendes Beispiel :

public static void processChildNode(NodeList listOfNodes, String tags) {
    for (int i = 0; i < listOfNodes.getLength(); i++) {
        if (listOfNodes.item(i) instanceof Element) {
            String tagPath = tags + "." + listOfNodes.item(i).getNodeName();
            if (listOfNodes.item(i).getChildNodes().getLength() >= 1) {
                processChildNode(listOfNodes.item(i).getChildNodes(),
                        tagPath);
            }

        } else if (listOfNodes.item(i) instanceof Text
                && listOfNodes.getLength() == 1) {
            String value = listOfNodes.item(i).getNodeValue();
            valueList.add(new String[] { tags, value });
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X