1

CSV 形式のデータを XML に変換するツールを作成しています。ユーザーは解析方法を指定します。つまり、CSV のどのフィールドが結果の XML のどのフィールドに入る、出力の XSD です。

(非常に単純化されたユースケース) 例:

CSV

Ciccio;Pippo;Pappo
1;2;3

XSD

(more stuff...)
<xs:element name="onetwo">
<xs:element name="three">
<xs:element name="four">

ユーザーがルールを与える

   Ciccio -> onetwo
   Pippo -> three
   Pappo -> four

これを Dataset を使用して C# で実装しましたが、Java でどのように実装できますか? DOM や JAXB などがあることは知っていますが、XSD は作成された XML を検証するためだけに使用されるようです。私が間違っている?

編集:すべてが実行時に必要です。受け取る XSD の種類がわからないため、存在しないオブジェクトをインスタンス化することも、データを入力することもできません。したがって、xjcはオプションではないと推測しています。

4

2 に答える 2

3

XSD出力ファイルには があるのでXML、これを作成する最良の方法は、XMLJava Architecture for XML Binding (JAXB) を使用することです。「JAXB の使用」チュートリアルを参照して、要件に合わせてこれを使用する方法の概要を確認してください。

基本的な考え方は次のとおりです。

  • XMLスキーマ、つまりXSDあなたが持っているものからJAXB Javaクラスを生成します
  • スキーマから派生した JAXB クラスを使用して、Java アプリケーションで XML コンテンツをアンマーシャリングおよびマーシャリングする
  • スキーマから派生した JAXB クラスを使用して Java コンテンツ ツリーをゼロから作成する
  • データを出力XMLファイルに非整列化します。

参考になるかもしれない別のチュートリアルを次に示します。

于 2012-09-01T18:04:49.110 に答える
0

これはまだ進行中の作業ですが、新しいドキュメント ツリーに要素を見つけたら、XSD を再帰的に書き出すことができます。

public void run() throws Exception {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(new InputSource(new FileReader(
            "schema.xsd")));

    Document outputDoc = builder.newDocument();

    recurse(document.getDocumentElement(), outputDoc, outputDoc);

    TransformerFactory transFactory = TransformerFactory.newInstance();
    Transformer transformer = transFactory.newTransformer();
    StringWriter buffer = new StringWriter();
    transformer.transform(new DOMSource(outputDoc),
            new StreamResult(buffer));
    System.out.println(buffer.toString());
}

public void recurse(Node node, Node outputNode, Document outputDoc) {

    if (node.getNodeType() == Node.ELEMENT_NODE) {
        Element element = (Element) node;
        if ("xs:element".equals(node.getNodeName())) {
            Element newElement = outputDoc.createElement(element
                    .getAttribute("name"));
            outputNode = outputNode.appendChild(newElement);

           // map elements from CSV values here?
        }
        if ("xs:attribute".equals(node.getNodeName())) {
           //TODO required attributes
        }
    }
    NodeList list = node.getChildNodes();
    for (int i = 0; i < list.getLength(); i++) {
        recurse(list.item(i), outputNode, outputDoc);
    }

}
于 2012-09-02T10:03:20.710 に答える