Как разобрать элемент XML root и выбрать некоторые его значения в Java? - PullRequest
0 голосов
/ 15 октября 2018

Я ищу практический способ разобрать корневой элемент XML и получить некоторые значения из него.Я пробовал много способов, но ни один из них не эффективен.

       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

                Document doc = factory.newDocumentBuilder().parse(fileLoaded);

                Element root = null;

                NodeList list = doc.getChildNodes();
               System.out.println(list.toString());
                for (int i = 0; i < list.getLength(); i++) {
                  if (list.item(i) instanceof Element) {
                    root = (Element) list.item(i);
                    System.out.println(root.toString());
                    break;
                  }
                }
                root = doc.getDocumentElement();
              }

XML-файл:

    <planes_for_sale id="planeId" num="1452" name="boing">
    <ad>
      <year> 1977 </year>
      <make> test </make>
      <model> Skyhawk </model>
      <color> Light blue and white </color>
      <description> New paint, nearly new interior,
        685 hours SMOH, full IFR King avionics </description>
      <price> 23,495 </price>
      <seller phone = "555-222-3333"> Skyway Aircraft </seller>
      <location>
      <city> Rapid City, </city>
      <state> South Dakota </state>
  </location>

В моем случае я хочу загрузить id, num, name из корневого элемента planes_for_sale.

Ответы [ 4 ]

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

Посмотрите на этот ответ Как читать XML с использованием XPath в Java

В нем показано, как

  • Читать в файле XML в DOM
  • Отфильтруйте набор узлов с помощью XPath
  • Выполните определенное действие для каждого из извлеченных узлов.

Вариант с поддержкой XPath 2.0 можно найти здесь

Как сопоставить строку, заканчивающуюся числом, используя XPath

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

Для всех, кто ищет практический путь, здесь один протестированный:

    DocumentBuilderFactory factory = DocumentBuilderFactory
                    .newInstance();

            Document doc = factory.newDocumentBuilder().parse(fileLoaded);
            doc.getDocumentElement().normalize();
            System.out.println("Root element :"
                    + doc.getDocumentElement().getNodeName());
            NodeList nList = doc.getElementsByTagName("planes_for_sale");

              System.out.println("----------------------------");

                 for (int temp = 0; temp < nList.getLength(); temp++) {
                    Node nNode = nList.item(temp);
                    System.out.println("\nCurrent Element :" + nNode.getNodeName());
                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                        Element eElement = (Element) nNode;
                        System.out.println("Plane name : " 
                           + eElement.getAttribute("name"));
                    }
                 }
0 голосов
/ 16 октября 2018

Используйте XPath для извлечения значений атрибутов и содержимого элемента.

    DocumentBuilder builder = DocumentBuilderFactory
                                 .newInstance()
                                 .newDocumentBuilder();

    Document doc = builder.parse(...);

    XPath xp = XPathFactory
                  .newInstance()
                  .newXPath();

    String id = xp.evaluate("planes_for_sale/@id", doc);
    String num = xp.evaluate("planes_for_sale/@num", doc);
    String name = xp.evaluate("planes_for_sale/@name", doc);

    System.out.println("id: " + id);
    System.out.println("num: " + num);
    System.out.println("name: " + name);

Производит:

id: planeId
num: 1452
name: boing
0 голосов
/ 15 октября 2018

Попробуйте использовать механизм маршалинга и демаршаллинга

JAXBContext jaxbContext = JAXBContext.newInstance(EmployeeMap.class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    EmployeeMap empMap = (EmployeeMap) jaxbUnmarshaller.unmarshal( new File("c:/temp/employees.xml") );

https://howtodoinjava.com/jaxb/jaxb-example-marshalling-and-unmarshalling-hashmap-in-java/

...