Вопрос по xml, java – Как мы можем конвертировать XML-файл в CSV?

-1

У меня есть файл XML

<?xml version="1.0" encoding="ISO-8859-1"?>
<Results>
    <Row>
        <COL1></COL1>
        <COL2>25.00</COL2>
        <COL3>2009-07-06 15:49:34.984</COL3>
        <COL4>00001720</COL4>
    </Row>
    <Row>
        <COL1>RJ</COL1>
        <COL2>26.00</COL2>
        <COL3>2009-07-06 16:04:16.156</COL3>
        <COL4>00001729</COL4>
    </Row>
    <Row>
        <COL1>SD</COL1>
        <COL2>28.00</COL2>
        <COL3>2009-07-06 16:05:04.375</COL3>
        <COL4>00001721</COL4>
    </Row>  
</Results>

Я должен преобразовать этот XML в файл CSV. Я слышал, что мы можем сделать это с помощью XSLT. Как я могу сделать это в Java (с / без XSLT)?

Ваш Ответ

6   ответов
4

loop through the rows:
    loop through all children of `Row`:
        write out the text
        append a comma
    new line

Этот быстрый маленький цикл запишет запятую в конце каждой строки, но я уверен, что вы сможете выяснить, как это удалить.

Для фактического разбора XML, я предлагаю использоватьJDOM, У него довольно интуитивно понятный API.

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

SAX API через стандартную JavaJAXP пакет. Это позволит вам написать класс, который получает события для каждого элемента XML, с которым сталкивается ваш читатель.

Кратко:

read your XML in using SAX record text values via the SAX DefaultHandler characters() method when you get an end event for a COL, record this string value when you get the ROW end event, simply write out a comma separated line of previously recorded values
Error: User Rate Limit Exceeded Rakesh Juyal
@ Томалак - ты прокомментировал неправильный ответ?
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

Зациклите каждую запись и добавьте ее в CSV-файл.

Вы забыли убежать (что, если в данных есть запятая?).
Я не думаю, что это крайне полезно, если вы не знакомы с доступным XML-интерфейсом :-(
Согласовано. Использование XSLT в этой ситуации является излишним. Нет необходимости изучать новый язык, просто чтобы вывести CSV из такого простого формата.
и как мы это сделаем, Дерек Rakesh Juyal
1

а затем использовать & lt; xsl: text & gt; в вашей таблице стилей для преобразования в текстовый вывод.

<xsl:text>&#10;</xsl:text>

генерирует новую строку. например.

5

Apache Commons Digester, Это довольно легко использовать - вот примерная идея:

Digester digester = new Digester();

digester.addObjectCreate("Results/Row", MyRowHolder.class);
digester.addCallMethod("Results/Row/COL1","addCol", 0);
// Similarly for COL2, etc.
digester.parse("mydata.xml");

Это создастMyRowHolder экземпляр (где это класс, который вы предоставляете). Этот класс будет иметьaddCol() метод, который будет вызываться для каждого<COLn> с содержанием этого тега.

& quot; Использование XSLT часто является плохой идеей & quot; - Могу я спросить, почему? :)
я добавил +1. я думаю, что этот ответ хороший
Плюс ко всему, постер спросил, как это сделать в Java без XSLT. Так что я не уверен, почему меня понизили :-(
Дигестер недостаточно используется. +1 за это
(а) производительность, (б) трудно отладить.
3

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text" encoding="ISO-8859-1" />

  <xsl:template match="/Results">
    <xsl:apply-templates select="Row" />  
  </xsl:template>

  <xsl:template match="Row">
    <xsl:apply-templates select="*" />  
    <xsl:if test="not(last())">
      <xsl:value-of select="'&#10;'" />  
    </xsl:if>
  </xsl:template>

  <xsl:template match="Row/*">
    <xsl:value-of select="." />
    <xsl:if test="not(last())">
      <xsl:value-of select="','" />  
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

Если ваши значения COL * могут содержать запятые, вы можете заключить значения в двойные кавычки:

  <xsl:template match="Row/*">
    <xsl:value-of select="concat('"', ., '"')" />
    <!-- ... --->

Если они могут содержать запятыеand двойные кавычки, вещи могут стать немного сложнее из-за необходимости экранирования. Вы знаете свои данные, и вы сможете решить, как лучше отформатировать вывод. Использование другого разделителя (например, TAB или символ трубы) также является опцией.

Error: User Rate Limit Exceeded

Похожие вопросы