Как разделить xml на заголовки и элементы, используя smooks? - PullRequest
0 голосов
/ 01 марта 2012

У меня есть XML-файл, примерно такой:

<batch>
    <header>
        <headerStuff />
    </header>
    <contents>
        <timestamp />
        <invoices>
            <invoice>
                <invoiceStuff />
            </invoice>
            <!-- Insert 1000 invoice elements here -->
        </invoices>
    </contents>
</batch>

Я хотел бы разделить этот файл на 1000 файлов с одинаковым headerStuff и только одним счетом.Документация Smooks очень гордится возможностями трансформаций, но, к сожалению, я не хочу этого делать.

Единственный способ, которым я понял, как это сделать, - повторить всю структуру в freemarker.Но это похоже на ненужное повторение структуры.Заголовок содержит около 30 различных тегов, поэтому будет много работы.

В настоящее время у меня есть следующее:

<?xml version="1.0" encoding="UTF-8"?>
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"    
    xmlns:calc="http://www.milyn.org/xsd/smooks/calc-1.1.xsd"
    xmlns:frag="http://www.milyn.org/xsd/smooks/fragment-routing-1.2.xsd"
    xmlns:file="http://www.milyn.org/xsd/smooks/file-routing-1.1.xsd">

    <params>
        <param name="stream.filter.type">SAX</param>
    </params>

    <frag:serialize fragment="INVOICE" bindTo="invoiceBean" />

    <calc:counter countOnElement="INVOICE" beanId="split_calc" start="1" />

    <file:outputStream openOnElement="INVOICE" resourceName="invoiceSplitStream">
        <file:fileNamePattern>invoice-${split_calc}.xml</file:fileNamePattern>
        <file:destinationDirectoryPattern>target/invoices</file:destinationDirectoryPattern>
        <file:highWaterMark mark="10"/>
    </file:outputStream>

    <resource-config selector="INVOICE">
        <resource>org.milyn.routing.io.OutputStreamRouter</resource>
        <param name="beanId">invoiceBean</param>
        <param name="resourceName">invoiceSplitStream</param>
        <param name="visitAfter">true</param>
    </resource-config>

</smooks-resource-list>

Это создает файлы для каждого тега счета, но я неНе знаю, как продолжить, чтобы получить заголовок также в файле.

РЕДАКТИРОВАТЬ:

Решение должно использовать Smooks.Мы используем его в приложении как общий сплиттер и просто создаем разные файлы конфигурации smooks для разных типов входных файлов.

Ответы [ 2 ]

1 голос
/ 24 апреля 2012

Я только начал с Smooks сам.Однако ... ваша проблема звучит идентично этому: http://www.smooks.org/mediawiki/index.php?title=V1.5:Smooks_v1.5_User_Guide#Routing_to_File

Вы должны будете предоставить выходной формат FTL в целом, что является недостатком использования инструмента общего назначения, я полагаю.Отображение данных часто включает в себя многое из того, что ощущается как избыточность. Одним из способов решения этой проблемы является использование соглашения, но оно должно быть встроено в структуру.

0 голосов
/ 01 марта 2012

Я не знаю smooks, но самое простое решение (с низкой производительностью) будет (для создания N-го файла):

  • скопировать всю структуру XML
  • удалитьвсе теги счета-фактуры, кроме N-го

Я не знаю, как это сделать в смоках, это только идея.В этом случае вам не нужно дублировать структуру xml в шаблоне freemarker.

...