Запрос для двух элементов с использованием DOM-XML в JAVA

Есть ли способ запросить два имени тега в DOM, используя «getElementsByTagName»

Я пытаюсь сделать свою программу разбором и XML из двух разных тегов «Школы» и «Больницы» и отображать атрибуты «id» и «текст» из каждого

Это возможно?

Мой код:

import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DomParse {

    public static void main(String[] args) {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    try {
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse("input2.xml");

    NodeList School = doc.getElementsByTagName("School");
    for(int i=0;i<School.getLength();i++){
        Node p = School.item(i);
        if(p.getNodeType()==Node.ELEMENT_NODE){
            Element person = (Element) p;
            String id = person.getAttribute("id");
            NodeList nameList = person.getChildNodes();
            for(int j=0;j<nameList.getLength();j++){
                Node n = nameList.item(j);
                if(n.getNodeType()==Node.ELEMENT_NODE){
                    Element name = (Element) n;
                    System.out.println("School "  + id + ": " + "\n" + "\n" + name.getTextContent());

                    NodeList Hospital = doc.getElementsByTagName("Hospitals");
                    for(int z=0;z<Hospital.getLength();z++){
                        Node k = Hospital.item(z);
                        if(k.getNodeType()==Node.ELEMENT_NODE){
                        Element uc = (Element) k;
                        NodeList uniqueList = uc.getChildNodes();
                        for(int l=0;l<uniqueList.getLength();l++){
                        Node a = uniqueList.item(l);
                            if(a.getNodeType()==Node.ELEMENT_NODE){
                                Element uniqcon = (Element) a;
                                System.out.println("Hospitals " + id + ": " + "\n" + "\n" + uniqcon.getTextContent() + "\n" );

                            }
                        }
                        }
                    }
                }
            }
        }
    }

    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
}
}

}

Входной файл:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<school>
<Hospitals size="standard">
        <Hospital codeSet="base" included="true" analysis="nI" definedAt="scan" id="0">
            <text>New England Medical. Services only urgent procedures.</text>
            <scanPatterns>
                <scanPattern occurs="1" scanPatternId="45" definedAt="scan" id="0"/>
                <scanPattern occurs="1" scanPatternId="46" definedAt="scan" id="1"/>
            </scanPatterns>
        </Hospital>

        <Hospital codeSet="base" included="true" analysis="I" SchoolId="4" definedAt="scan" id="1">
            <text>Gibson Memorial. 20 miles away.</text>
            <scanPatterns>
                <scanPattern occurs="1" scanPatternId="42" definedAt="scan" id="0"/>
                <scanPattern occurs="1" scanPatternId="39" definedAt="scan" id="1"/>
            </scanPatterns>
        </Hospital>
        </Hospitals>
<Schools>
        <School definedAt="scan" id="0">
            <text>Craven County Middle School</text>
        </School>
        <School definedAt="scan" id="1">
            <text>WestLake Middle School</text>
        </School>
        </Schools>
</school>

person Derrick O'Niell    schedule 12.05.2016    source источник
comment
навигация в DOM болезненна, взгляните на XPath, чтобы получить более простой способ доступа к значениям в документе stackoverflow.com/a/2811101/ 3215527   -  person wero    schedule 12.05.2016
comment
Вы можете создать метод, который получает NodeList в качестве входных данных, перебирает элементы и печатает нужные значения. Предполагая, что имя метода printElements, вы можете вызвать его, используя printElements(doc.getElementsByTagName("School)" и printElements(doc.getElementsByTagName("Hospital"). Кроме того: почему вы печатаете все больницы для каждой школы?   -  person Tobias Brösamle    schedule 12.05.2016


Ответы (1)


Если вы используете XPath, эта работа будет намного проще.

XPath xPath =  XPathFactory.newInstance().newXPath();
String schoolExpression = "//School";
String hospitalExpression = "//Hospital";

Получите NodeList, используя выражение XPath, затем выполните итерацию по узлам и получите идентификатор и текстовое содержимое:

NodeList nodeList = (NodeList) xPath.compile(schoolExpression).evaluate(xmlDocument, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
        System.out.println(nodeList.item(i).getAttributes().getNamedItem("id").getNodeValue());  // gets you your id
        System.out.println(nodeList.item(i).getTextContent());  // gets you the context         
}
person kanghj91    schedule 14.05.2016