Объединить два XML-файла в Java - PullRequest
13 голосов
/ 15 марта 2009

У меня есть два XML-файла схожей структуры, которые я хочу объединить в один файл. В настоящее время я использую EL4J XML Merge , с которым я столкнулся в этом уроке. Однако он не объединяется, как я ожидаю, например, основная проблема заключается в том, что он не объединяет оба файла в один элемент, который также содержит 1, 2, 3 и 4. Вместо этого он просто отбрасывает 1 и 2 или 3 и 4 в зависимости от того, какой файл объединяется первым.

Так что я был бы признателен всем, кто имеет опыт работы с XML Merge, если бы они могли сказать мне, что я могу делать неправильно, или, в качестве альтернативы, кто-нибудь знает хороший XML API для Java, который был бы способен объединять файлы по мере необходимости

Большое спасибо за вашу помощь заранее

Edit:

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

Ниже приведен пример типа структуры XML-файлов, которые я пытаюсь объединить.

<run xmloutputversion="1.02">
    <info type="a" />
    <debugging level="0" />
    <host starttime="1237144741" endtime="1237144751">
        <status state="up" reason="somereason"/>
        <something avalue="test" test="alpha" />
        <target>
            <system name="computer" />
        </target>
        <results>
            <result id="1">
                <state value="test" />
                <service value="gamma" />
            </result>
            <result id="2">
                <state value="test4" />
                <service value="gamma4" />
            </result>
        </results>
        <times something="0" />
    </host>
    <runstats>
        <finished time="1237144751" timestr="Sun Mar 15 19:19:11 2009"/>
        <result total="0" />
    </runstats>
</run>

<run xmloutputversion="1.02">
    <info type="b" />
    <debugging level="0" />
    <host starttime="1237144741" endtime="1237144751">
        <status state="down" reason="somereason"/>
        <something avalue="test" test="alpha" />
        <target>
            <system name="computer" />
        </target>
        <results>
            <result id="3">
                <state value="testagain" />
                <service value="gamma2" />
            </result>
            <result id="4">
                <state value="testagain4" />
                <service value="gamma4" />
            </result>
        </results>
        <times something="0" />
    </host>
    <runstats>
        <finished time="1237144751" timestr="Sun Mar 15 19:19:11 2009"/>
        <result total="0" />
    </runstats>
</run>

Ожидаемый результат

<run xmloutputversion="1.02">
    <info type="a" />
    <debugging level="0" />
    <host starttime="1237144741" endtime="1237144751">
        <status state="down" reason="somereason"/>
        <status state="up" reason="somereason"/>
        <something avalue="test" test="alpha" />
        <target>
            <system name="computer" />
        </target>
        <results>
            <result id="1">
                <state value="test" />
                <service value="gamma" />
            </result>
            <result id="2">
                <state value="test4" />
                <service value="gamma4" />
            </result>
            <result id="3">
                <state value="testagain" />
                <service value="gamma2" />
            </result>
            <result id="4">
                <state value="testagain4" />
                <service value="gamma4" />
            </result>
        </results>
        <times something="0" />
    </host>
    <runstats>
        <finished time="1237144751" timestr="Sun Mar 15 19:19:11 2009"/>
        <result total="0" />
    </runstats>
</run>

Ответы [ 12 ]

0 голосов
/ 27 марта 2009

Рассматривали ли вы просто то, что вам не нужно «правильно» анализировать XML, а просто рассматривать файлы как большие длинные строки и использовать скучные старые вещи, такие как хэш-карты и регулярные выражения ...? Это может быть одним из тех случаев, когда причудливые аббревиатуры с X в них просто делают работу более скудной, чем она должна быть.

Очевидно, что это немного зависит от того, сколько данных вам действительно нужно проанализировать во время слияния. Но, судя по всему, ответ на этот вопрос невелик.

0 голосов
/ 15 марта 2009

Возможно, вы сможете написать приложение Java, которое десерилизует XML-документы в объекты, а затем программно «объединить» отдельные объекты в коллекцию. Затем вы можете сериализовать объект коллекции обратно в файл XML со всем «объединенным».

API JAXB имеет несколько инструментов, которые могут преобразовывать документ / схему XML в классы Java. Инструмент "xjc" мог бы сделать это, хотя я не могу вспомнить, можете ли вы создавать классы непосредственно из документа XML или вам сначала нужно сгенерировать схему. Существуют инструменты, которые могут генерировать схему из документа XML.

Надеюсь, это поможет ... не уверен, что это то, что вы искали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...