Получить элемент по определенному атрибуту, заданному пользователем ввода в Java - PullRequest
0 голосов
/ 26 октября 2018

Я новичок в программировании на Java. У меня есть задание, где я должен получить элемент определенного атрибута. Я использую netbeans для своего проекта. Атрибут взят от пользователя, который будет найден в файле xml, и будет отображен элемент этого атрибута. Я много искал, но не мог найти решение. Пожалуйста, помогите мне. Я использую XPathFactory. Например, если я ввожу id во входные данные, он должен отображать элемент i.e gemstone. Код не показывает ошибок, он правильно компилируется, но не выводит никаких результатов. Ниже приведен код для Java и мой XML-файл.

Java-файл

 String data;
       Scanner input = new Scanner (System.in);
       System.out.println("Enter Attribute whose Element you want to be displayed ");
       data = input.nextLine();
       System.out.println(" \n ");
       try {
    File fXmlFile = new File("stonesorg.xml");
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(fXmlFile);
        doc.getDocumentElement().normalize();

        XPathFactory factory = XPathFactory.newInstance();
        XPath xpath = factory.newXPath();
        NodeList node;
        node = (NodeList) xpath.evaluate(data, doc, XPathConstants.NODESET);
        for (int x = 0; x < node.getLength(); x++)
        {
            System.out.print(node.item(x).getNodeName()+" ");
        }

         System.out.println(" \n "); 
       }
       catch(ParserConfigurationException | SAXException | IOException | DOMException e)
       {

       }   
    }

XML-файл

<gemstone id = "G1">
        <Name name= "Amethyst"> 
        <namehistory> The name comes from the Koine Greek. </namehistory>
        <namemeaning> Intoxicate </namemeaning>
        </Name>
        <identification> 
        <color> Violet  </color>
        <composition> Quartz,Silica (silicon dioxide, SiO2)</composition>
        <mohsScale> 7–lower in impure varieties</mohsScale>
        <crystalSystem> Trigonal</crystalSystem>
        <category> Silicate mineral </category>
        </identification>
        <history>It is from Magaliesburg, South Africa.The Greeks believed amethyst gems could prevent intoxication, while medieval European soldiers wore amethyst amulets as protection in battle in the belief that amethysts heal people and keep them cool-headed.</history>
        <geographicaldistribution>
            <country>Brazil</country>
            <country>Russia</country>
            <country>South Korea</country>
            <country>Colorado</country>
            <country>Texas</country>
            <country>Pennsylvania</country>
            <country>Ontario</country>
        </geographicaldistribution>
        <birthstone>  Birthstone for February   </birthstone>
        <properties>
            <meltingpoint> 
                            <celsius> 1650±75 °C </celsius>
                            <fahrenheit>3002 ±167°F </fahrenheit>
            </meltingpoint>
            <solubility> Insoluble in common solvents </solubility>
            <gravity> 2.65 constant </gravity>
        </properties>
    </gemstone>

1 Ответ

0 голосов
/ 26 октября 2018

Прежде всего: никогда не подавляйте исключения (если вы не сжимали пример кода).По крайней мере, поместите e.printStackTrace(); туда

catch(ParserConfigurationException | SAXException | IOException | DOMException e)
   {
     e.printStackTrace();
   }   

Второе: ваш код не должен компилироваться - в catch - XPathException

отсутствует третье (и основное): после добавленияXPathException ваш код работает, но вы должны знать, какой XPath вы вводите в качестве ввода.(пожалуйста, прочитайте документы и руководства по XPath).

Это не так просто, как просто имя узла, которое вы хотите получить.Пока вы запускаете его из верхнего документа - да, вы можете ввести gemstone - потому что это корневой элемент, но для других узлов вы должны предоставить действительный XPath - в противном случае вы ничего не получите.

Кстати попробуйтечтобы сделать ваше утверждение для печати более информативным для отладки, например:

System.out.println(node.item(x).getNodeName()+" " + node.item(x).getTextContent());

Позже вы можете сделать более красивым ...

Итак, попробуйте несколько примеров:

  • gemstone
  • gemstone/Name/@name
  • gemstone/geographicaldistribution/*
  • gemstone/geographicaldistribution/country
  • //country[3]
  • //country[text()='Texas']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...