1

次のようなカンマ区切りの値が連続したフラットな .txt ファイルがあります。

1,name1,department1
2,name2,department2
3,name3,department3
...
...

ここで、これらのレコードを .txt ファイルから読み取って xml に書き込みたいとします。出力は次のようになります。

<Employees>
     <Employee>
          <Code>1</Code>
          <Name>name1</Name>
          <Department>department1</Department>
     </Employee>
     <Employee>
          <Code>2</Code>
          <Name>name2</Name>
          <Department>department2</Department>
     </Employee>
     <Employee>
          <Code>3</Code>
          <Name>name3</Name>
          <Department>department3</Department>
     </Employee>
</Employees>

これを達成するために、さまざまな質問/投稿を行ってきましたが、どういうわけか、従うべきアプローチと、 XStream のようにどの XMLBuilder を使用する必要があるかについて混乱していますか?

最高のパフォーマンスを達成するには、どのアプローチに従うべきか誰か教えてもらえますか?

4

4 に答える 4

1

openCSV などの CSV ライブラリを使用してファイルを読み取り、JAXB を使用して XML ファイルを作成します。

where has fieldsなどでEmployeesクラスを作成できます。CSV ライブラリを使用して入力します。いずれかの方法を使用して、すべてを 1 行でファイルに書き出します。List<Employee>EmployeeCodeNameJAXB.marshal

簡単なサンプルコード

@XmlRootElement
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
public class XmlWriterTest
{
    public String foo;
    public List<String> bars;

    public static void main(String[] args)
    {
        XmlWriterTest test = new XmlWriterTest();
        test.foo = "hi";
        test.bars = Arrays.asList("yo", "oi");
        JAXB.marshal(test, System.out);
    }   
}
于 2012-09-14T12:50:00.957 に答える
0

1行のawkソリューションはどうですか?

awk -F, 'BEGIN{printf "<Employees>\n"}END{printf "</Employees>\n"}{printf"<Employee><Code>%s</Code><Name>%s</Name><Department>%s</Department></Employee>\n",$1,$2,$3}' data.txt 

Javaプログラムを書くことは、そのような単純な問題にはやり過ぎのように思われるでしょう。

アップデート

出力をフォーマットしたい場合は、それをxmllintコマンドにパイプすることができます。

$ awk -F, 'BEGIN{printf "<Employees>"}END{printf "</Employees>"}{printf"<Employee><Code>%s</Code><Name>%s</Name><Department>%s</Department></Employee>",$1,$2,$3}' data.txt | xmllint --format -
<?xml version="1.0"?>
<Employees>
  <Employee>
    <Code>1</Code>
    <Name>name1</Name>
    <Department>department1</Department>
  </Employee>
  <Employee>
    <Code>2</Code>
    <Name>name2</Name>
    <Department>department2</Department>
  </Employee>
  <Employee>
    <Code>3</Code>
    <Name>name3</Name>
    <Department>department3</Department>
  </Employee>
</Employees>
于 2012-09-14T20:07:36.090 に答える
0

疑似コードでの最も簡単な方法は次のとおりです。

file.write("<Employees>");
foreach(String line : file)
{
    String[] parts = line.split(",");
    file.write("<Employee><Code>" + parts[0] + "</Code><Name>" + parts[1] + "</Name><Department>" + parts[2] + "</Department></Employee>");
}
file.write("</Employees>");

明らかに、このソリューションは非常に単純であり、フラット ファイルのフィールドにコンマが含まれておらず、各行に正確に 3 つの列があることを前提としています。

于 2012-09-14T12:46:07.570 に答える
0

あなたのコメントから、印刷/書き込みを使用してxmlビルダーなしでこれを行うのが最も簡単な方法のようです:

  1. txtファイルを1行ずつ読む
  2. セパレータとして「,」を使用してフィールドを分割する
  3. シンプルな System.out.print メソッドを使用して、xml マークアップを file/stdout に書き込みます。

XML ヘッダーを忘れないでください。

フォーマットが頻繁に変更される場合は、.xsd schemaand を使用jaxbしてクラス階層とマーシャリング/アンマーシャリング コードを生成しますが、この場合はやり過ぎです。

于 2012-09-14T12:47:55.477 に答える