Как читать содержимое XML как строку из файла в Java - PullRequest
1 голос
/ 18 июня 2019

Я получаю текстовый файл из моего источника, который имеет содержание ниже в одну строку.

<employees><employee><id>101</id><name>Lokesh Gupta</name><title>Author</title></employee><employee><id>102</id><name>Brian Lara</name><title>Cricketer</title></employee></employees>

В моем коде я должен читать данные каждого сотрудника как String. Например: <employee><id>101</id><name>Lokesh Gupta</name><title>Author</title></employee> как строка и <employee><id>102</id><name>Brian Lara</name><title>Cricketer</title></employee> как другая строка. Когда я печатаю содержимое на консоли, оно должно печатать <employee><id>101</id><name>Lokesh Gupta</name><title>Author</title></employee>. Не могли бы вы дать мне знать, как это сделать?

Как правило, файл, который я получаю из моего источника, состоит из более 100 миллионов сведений о сотруднике в одну строку, и я должен прочитать все эти данные сотрудника в виде отдельной строки и сохранить их в другом файле. Поскольку размер файла огромен, я попытался использовать анализатор SAX, и с этим я могу анализировать содержимое XML, но не могу прочитать все данные в виде строки.

Я пытался использовать SAX Parser и обработчик по умолчанию для чтения этого содержимого. Но в методах startElement и EndElement мне нужно написать свою логику для добавления < и >, < и /> соответственно. Я хочу узнать лучший способ прочтения этого текста вместо написания логики для добавления угловых скобок.

1 Ответ

0 голосов
/ 18 июня 2019

Один из способов сделать это - использовать функцию потоковой передачи JaxB, которая эффективно использует SAX внизу. Вот пример:

 // create JAXBContext for the primer.xsd
        JAXBContext context = JAXBContext.newInstance("primer");

        Unmarshaller unmarshaller = context.createUnmarshaller();

        // purchase order notification callback
        final PurchaseOrders.Listener orderListener = new PurchaseOrders.Listener() {
            public void handlePurchaseOrder(PurchaseOrders purchaseOrders, PurchaseOrderType purchaseOrder) {
                System.out.println("this order will be shipped to "
                        + purchaseOrder.getShipTo().getName());
            }
        };

        // install the callback on all PurchaseOrders instances
        unmarshaller.setListener(new Unmarshaller.Listener() {
            public void beforeUnmarshal(Object target, Object parent) {
                if(target instanceof PurchaseOrders) {
                    ((PurchaseOrders)target).setPurchaseOrderListener(orderListener);
                }
            }

            public void afterUnmarshal(Object target, Object parent) {
                if(target instanceof PurchaseOrders) {
                    ((PurchaseOrders)target).setPurchaseOrderListener(null);
                }
            }
        });

        // create a new XML parser
        SAXParserFactory factory = SAXParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XMLReader reader = factory.newSAXParser().getXMLReader();
        reader.setContentHandler(unmarshaller.getUnmarshallerHandler());

        for (String arg : args) {
            // parse all the documents specified via the command line.
            // note that XMLReader expects an URL, not a file name.
            // so we need conversion.
            reader.parse(new File(arg).toURI().toString());
        }
    }
}

Взят прямо из образцов jaxB в jaxb / ri. https://github.com/javaee/jaxb-v2/blob/master/jaxb-ri/samples/src/main/samples/streaming-unmarshalling/src/Main.java

Интерфейс PurchaseOrders.Listener:

public static interface Listener {
        void handlePurchaseOrder(PurchaseOrders purchaseOrders, PurchaseOrderType purchaseOrder);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...