Как получить все xml субэлементов из элемента Дом с l oop в Java? - PullRequest
1 голос
/ 04 марта 2020

Вывод на скриншоте ниже, это частично нормально. Но я хочу показать только узлы в теге, как показано в выводе, но здесь это повторяется с номером тега. Там должно показывать только 3 результата на реактор. Вывод ожидается, как я хотел, но результат показывает больше, чем обычно.

Что не так с циклом? Помогите пожалуйста.

import javax.xml.parsers.DocumentBuilderFactory;  
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;  
import org.w3c.dom.NodeList;  
import org.w3c.dom.Node;  
import org.w3c.dom.Element;
import java.io.File;


public class Javatracer {

    public static void main(String args[])   
    {  
    try   
    {  

    File file = new File("trace.xml");

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(file);  
    doc.getDocumentElement().normalize();

    System.out.println("Root element: " + doc.getDocumentElement().getNodeName());  
    NodeList nodeList = doc.getElementsByTagName("actor");  

    for (int itr = 0; itr < nodeList.getLength(); itr++)
    {  
        Node node = nodeList.item(itr);  
        System.out.println("\nNode Name :" + node.getNodeName());  

        if (node.getNodeType() == Node.ELEMENT_NODE)   
            {  

            NodeList portnodeList = doc.getElementsByTagName("port");
            for (int portitr = 0; portitr < portnodeList.getLength(); portitr++)
            {

                Node portnode = portnodeList.item(portitr);
                Element portElement = (Element) portnode;  
                System.out.println("Channel Name: "+ portElement.getAttribute("name")+" "
                        + "| Channel Type: "+ portElement.getAttribute("type")+" | "
                                + "Channel Rate: "+ portElement.getAttribute("rate"));  


            }

            }  
    }   
    }   
    catch (Exception e)   
    {  
    e.printStackTrace();  
    }  
}

}

Вот файл xml:

<?xml version="1.0" encoding="UTF-8"?>
<sdf3 version="1.0" type="csdf">

    <applicationGraph name="noname">

        <csdf name="noname" type="noname">

            <actor name="micf_0" type="a">
                <port name="in_channel_1" type="out" rate="16"/>
                    <port name="in_channel_2" type="out" rate="16"/>
                    <port name="in_channel_3" type="out" rate="16"/>
            </actor>
            <actor name="micf_1" type="b">
                <port name="in_channel_1" type="out" rate="16"/>
                    <port name="in_channel_2" type="out" rate="16"/>
                    <port name="in_channel_3" type="out" rate="16"/>
            </actor>
            <actor name="micf_1" type="b">
                <port name="in_channel_1" type="out" rate="16"/>
                    <port name="in_channel_2" type="out" rate="16"/>
                    <port name="in_channel_3" type="out" rate="16"/>
            </actor>
            <actor name="micf_1" type="b">
                <port name="in_channel_1" type="out" rate="16"/>
                    <port name="in_channel_2" type="out" rate="16"/>
                    <port name="in_channel_3" type="out" rate="16"/>
            </actor>
            <actor name="micf_1" type="b">
                <port name="in_channel_1" type="out" rate="16"/>
                    <port name="in_channel_2" type="out" rate="16"/>
                    <port name="in_channel_3" type="out" rate="16"/>
            </actor>

        </csdf>
</sdf3>

enter image description here

1 Ответ

3 голосов
/ 04 марта 2020

Когда вы вызываете getElementsByTagName(), не вызывайте его в документе, вызывайте его на родительском узле.

Когда вы вызываете метод на doc, он сканирует весь документ на наличие элементов с таким именем.

Когда вы вызываете метод в node, он будет сканировать только подэлементы этого узла на наличие элементов с таким именем.

Итак, измените эту строку:

NodeList portnodeList = doc.getElementsByTagName("port");

К этому:

NodeList portnodeList = ((Element) node).getElementsByTagName("port");
...