Как бы вы использовать Java для обработки различных XML-документов?

голоса
2

Я ищу лучший способ для разбора различных документов XML с помощью приложения Java. Я сейчас делаю это с SAX и пользовательский обработчик содержимого и он работает большой - яркий и стабильный.

Я решил рассмотреть вариант , имеющий ту же программу, что в настоящее время recieves единый формат XML документ, получить два дополнительных форматов XML документов, с различными изменениями XML элементов. Я надеялся , что просто поменять на ContentHandler с соответствующим, основанным на первом «StartElement» в документе ... но, э-э-Дух, то ContentHandler установлен , и тогда документ разобран!

... constructor ...
{
SAXParserFactory spf = SAXParserFactory.newInstance();

try {
SAXParser sp = spf.newSAXParser();
parser = sp.getXMLReader();
parser.setErrorHandler(new MyErrorHandler());
} catch (Exception e) {} 

... parse StringBuffer ...
try {
parser.setContentHandler(pP);
parser.parse(new InputSource(new StringReader(xml.toString())));
return true;
} catch (IOException e) {
    e.printStackTrace();
} catch (SAXException e) {
    e.printStackTrace();
}
...

Таким образом, это не кажется, что я могу сделать это так, как я сначала думал, что я мог.

Это , как говорится, я смотрю на это совсем не так? Каков наилучший способ для синтаксического анализа несколько дискретных, XML документов с тем же кодом обработки XML? Я пытался спросить в более общем пост ранее ... но, я думаю , что я был слишком расплывчато . Для скорости и эффективности целей я никогда не смотрел на DOM , потому что эти XML - документы достаточно велики , и система получает около 1200 каждые несколько минут. Это просто один из способов отправки информации

Для того, чтобы этот вопрос слишком долго, и добавить к моей путанице; Ниже приведен макет некоторых различных документов XML, которые я хотел бы иметь один SAX, StAX, или ?? парсер чисто дело.

products.xml:

<products>
<product>
  <id>1</id>
  <name>Foo</name>
<product>
  <id>2</id>
  <name>bar</name>
</product>
</products>

stores.xml:

<stores>
<store>
  <id>1</id>
  <name>S1A</name>
  <location>CA</location>
</store>
<store>
  <id>2</id>
  <name>A1S</name>
  <location>NY</location>
</store>
</stores>

managers.xml:

<managers>
<manager>
  <id>1</id>
  <name>Fen</name>
  <store>1</store>
</manager>
<manager>
  <id>2</id>
  <name>Diz</name>
  <store>2</store>
</manager>
</managers>
Задан 27/08/2008 в 17:55
источник пользователем
На других языках...                            


9 ответов

голоса
3

Как я понимаю, проблема в том, что вы не знаете, какой формат документ перед разбором. Вы можете использовать шаблон делегата. Я предполагаю, что вы не против проверки DTD / XSD / Etcetera и что это нормально для DefaultHandler иметь состояние.

public class DelegatingHandler extends DefaultHandler {

    private Map<String, DefaultHandler> saxHandlers;
    private DefaultHandler delegate = null;

    public DelegatingHandler(Map<String, DefaultHandler> delegates) {
        saxHandlers = delegates;
    }

    @Override
    public void startElement(String uri, String localName, String name,
            Attributes attributes) throws SAXException {
       if(delegate == null) {
           delegate = saxHandlers.get(name);
       }
       delegate.startElement(uri, localName, name, attributes);
    }

    @Override
    public void endElement(String uri, String localName, String name)
            throws SAXException {
        delegate.endElement(uri, localName, name);
    }

//etcetera...
Ответил 27/08/2008 в 18:38
источник пользователем

голоса
2

Обратитесь к документации по XMLReader.setContentHandler () , он говорит:

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

Таким образом, вы должны быть в состоянии создать SelectorContentHandlerчто потребляет события до первого startElementсобытия, основываясь на том , что меняется ContentHandlerна читателе XML, и передает первое событие начала элемента для нового контента обработчика. Вы просто должны пройти XMLReaderк SelectorContentHandlerв конструкторе. Если вам нужны все события , чтобы быть Пропуска для словаря конкретного обработчика содержимого, SelectorContentHandlerдолжен кэшировать события , а затем передать их, но в большинстве случаев это не требуется.

На стороне записки, я в последнее время используется XOM практически во всех моих проектах для обработки XML JA до сих пор производительность не является проблемой.

Ответил 27/08/2008 в 19:58
источник пользователем

голоса
2

Я попытался SAXParser один раз, но однажды я нашел XStream я никогда не возвращался к нему. С XStream вы можете создать Java - объектов и преобразовывать их в XML. Отправить их и использовать XStream для воссоздания объекта. Очень проста в использовании, быстрая и создает чистый XML.

В любом случае вы должны знать, какие данные ваших идти к приемнику из файла XML. Вы можете отправить их по-разному, чтобы знать, какой анализатор использовать. Или есть объект данных, который может вместить все, но только одна структура заполняется (продукт / магазин / менеджеров). Может быть что-то вроде:

public class DataStructure {

    List<ProductStructure> products;

    List<StoreStructure> stors;

    List<ManagerStructure> managers;

    ...

    public int getProductCount() {
        return products.lenght();
    }

    ...
}

И с XStream преобразовать в XML прислать, а затем воссоздать объект. Тогда не то, что вы хотите с ним.

Ответил 27/08/2008 в 18:30
источник пользователем

голоса
2

Вы проделали хорошую работу, объясняя, что вы хотите сделать, но не почему. Есть несколько структур XML, которые упрощают сортировочное и демаршаллизация Java объектов в / из XML.

Самый простой Commons Digester , который я обычно использую для разбора файлов конфигурации. Но если вы хотите иметь дело с объектами Java , то вы должны смотреть на Castor , JiBX , JAXB , XMLBeans , XStream , или что - то подобное. Касторовое или JiBX мои два фаворита.

Ответил 27/08/2008 в 18:22
источник пользователем

голоса
1

JAXB . Java Architecture для XML Binding. В основном вы создаете XSDопределяющий макете XML (я полагаювы также можете использовать DTD). Затем вы проходите XSD компилятор JAXB и компилятор создает классы Java маршала и распаковать ваш XMLдокумент в объекты Java. Это действительно просто.

Кстати, есть параметры командной строки для JAXB, чтобы указать имя пакета, который вы хотите поместить в результате классов в и т.д.

Ответил 27/08/2008 в 18:20
источник пользователем

голоса
0

VTD-XML известен как лучшая технология обработки XML для обработки XML сверхмощного. Смотрите ссылку ниже для доказательства

http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf

Ответил 09/04/2016 в 19:24
источник пользователем

голоса
0

:-)

Да, у меня есть некоторый уклон в сторону Stax. Но, как я сказал, связывание данных часто является более удобным, чем потоковым решением. Но если это потоковое вы хотите, и не нуждается в конвейерном (из нескольких этапов фильтрации), Stax проще, чем SAX.

И еще одно: так хорошо, как XOM является (аппроксимируемостью альтернативы), часто модель дерева не правильно использовать, если вы не имеете дело с «документ-ориентированных» XML (~ = Xhtml страниц, DocBook, открытые офисные Документах). Для обмена данными, конфигурационные файлы и т.д. связывание данных является более удобным, более эффективным, более естественно. Просто не говорят нет моделей дерева DOM, как для этих случаев использования. Таким образом, JAXB, XStream, JiBX хороши. Или, более приобретенный вкус, варочный котел, касторовое, XMLBeans.

Ответил 27/01/2009 в 21:26
источник пользователем

голоса
0

Согласитесь с StaxMan, который достаточно интересно хочет использовать Stax. Это тянуть на основе синтаксического анализа вместо нажимной вы используете. Это потребовало бы некоторые существенные изменения в свой код, хотя.

Ответил 08/01/2009 в 15:32
источник пользователем

голоса
0

Если вы хотите более динамичную управляемость, Stax подход, вероятно, работают лучше, чем Сакс. Это довольно низкий уровень, до сих пор; если вы хотите более простой подход, XStream и JAXB мои фавориты. Но они требуют довольно жестких объектов для сопоставления.

Ответил 08/01/2009 в 05:00
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more