Лучший способ добраться до нужного тега в файле XML, когда он повторяется? - PullRequest
1 голос
/ 25 января 2020

первый пост здесь. У меня есть файл XML, который содержит тег «usine» несколько раз, и я делаю это неправильно, и я хочу посмотреть, есть ли более оптимальный способ сделать это. Я впервые работаю с XML и Node / NodeList, поэтому я все еще знакомлюсь с ним.

Вот файл XML

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<metadonnees>
    <usine type="usine-matiere">
        <icones>
            <icone type="vide" path="src/ressources/UMP0%.png"/>
            <icone type="un-tiers" path="src/ressources/UMP33%.png"/>
            <icone type="deux-tiers" path="src/ressources/UMP66%.png"/>
            <icone type="plein" path="src/ressources/UMP100%.png"/>
        </icones>
        <sortie type = "metal"/>
        <interval-production>100</interval-production>
    </usine>
    <usine type="usine-aile">
        <icones>
            <icone type="vide" path="src/ressources/UT0%.png"/>
            <icone type="un-tiers" path="src/ressources/UT33%.png"/>
            <icone type="deux-tiers" path="src/ressources/UT66%.png"/>
            <icone type="plein" path="src/ressources/UT100%.png"/>
        </icones>
        <entree type="metal" quantite="2"/>
        <sortie type="aile"/>
        <interval-production>50</interval-production>
    </usine>
</metadonnees>

<simulation>
    <usine type="usine-matiere" id="11" x="32" y="32"/>
    <usine type="usine-aile" id="21" x="320" y="32"/>
    <chemins>
        <chemin de="11" vers="21" />
        <chemin de="21" vers="41" />
    </chemins>
</simulation>

Например, если я хочу получить значение x 'usine type = "usine-aile"' в теге имитации, вот код, который я использую:

        NodeList nList = doc.getElementsByTagName("simulation");
        Node positionNode = nList.item(0);
        Element elementPosition = (Element) positionNode;

        NodeList cooList = elementPosition.getElementsByTagName("usine");
        Node cooNode = cooList.item(0);
        Element cooElem = (Element) cooNode;

        System.out.println(cooElem.getAttribute("x"));

В основном я должен сделать два NodeList, потому что нужный мне элемент находится в теге, а не тот, что в теге, поэтому первый NodeList должен найти меня в теге, а затем я go глубже создаю новый NodeList, чтобы найти нужный мне. Есть лучший способ сделать это? Я, вероятно, делаю это неправильно, поэтому я буду знать ваши ответы. Спасибо

1 Ответ

0 голосов
/ 25 января 2020

Первый , Получить элементы по имени тега (например, получить элементы usine), он возвращает Nodelist этого тега. например, в simulation у вас есть два тега usine (a NodeList с длиной 2).

Second , вы можете повторить этот Nodelist и делать все, что захотите каждый узел (элемент), например, вы можете получить атрибут каждого тега usine (x, y, id)

В итоге

1- Получить элемент по имени тега (NodeList)

2- Итерировать нодлист

3- Обработать узлы (например, получить атрибут каждого узла в процессе итерации (* 1027) *, y, id)

Я кодировал ваш сценарий следующим образом

public static void main(String argv[]) throws ParserConfigurationException, IOException, SAXException {

        //Read xml file
        File fXmlFile = new File("/test.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);

        //Get usine nodes
        NodeList nodeList = doc.getElementsByTagName("usine");

        //Iterate nodeList
        for (int temp = 0; temp < nodeList.getLength(); temp++) {

            //Get each node and process it
            Node node = nodeList.item(temp);

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

                //Print attributes of the node
                Element element = (Element) node;
                System.out.println("X = " + element.getAttribute("x"));
                System.out.println("Y = " + element.getAttribute("y"));
                System.out.println("ID = " + element.getAttribute("id"));

            }
        }
    }

В этом посте мы используем DOM Parser для разбора XML вы можете использовать эту ссылку , чтобы познакомиться с другими XML библиотеками обработки, такими как: SAX Parser, StAX Parser и JAXB , они намного лучше, чем DOM Parser с точки зрения скорости и производительности.

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