2017-05-27 16 views
0

私は一般的なものを書いています(実際にあまり一般的ではありません; 2つの前提条件:1>すべての要素は必須です2>複数のセグメントがあれば、 'n'回)のCCB /フラットファイルからXMLを生成するプログラムです。 私は文字列入力を提供しています。今のフラットファイルの内容とxml形式のXSDの写真以外の設定xmlを考慮しています。私は下にこれらの入力を提供しています一般的な方法でフラットファイルからXMLへの変換

<complex name="PARENT"> 
<complex name="CHILD"> 
    <complex name="GRANT-CHILD" count="2"> 
     <field name="A" length="7"/> 
     <field name="B" length="11"/> 
     <field name="C" length="7"/> 
     <field name="D" length="7"/> 
     <field name="E" length="1"/> 
     <field name="F" length="20"/> 
     <field name="G" length="10"/> 
     <field name="H" length="10"/> 
     <field name="I" length="7"/> 
     <field name="J" length="7"/> 
     <field name="K" length="7"/> 
     <field name="L" length="7"/> 
    </complex> 
</complex> 

`

サンプルXMLは次のようになります。

<PARENT> 
<CHILD> 
    <GRANT-CHILD> 
     <A /> 
     <B /> 
     <C /> 
     <D /> 
     <E /> 
     <F /> 
     <G /> 
     <H /> 
     <I /> 
     <J /> 
     <K /> 
     <L /> 
    </GRANT-CHILD> 
    <GRANT-CHILD> 
     <A /> 
     <B /> 
     <C /> 
     <D /> 
     <E /> 
     <F /> 
     <G /> 
     <H /> 
     <I /> 
     <J /> 
     <K /> 
     <L /> 
    </GRANT-CHILD> 
</CHILD> 

私のロジックは、それがある時はいつでも、あるcomplex私は対応する属性でタグを生成しています(私が属性lengthの値を探していて、それらの多くの文字を入力文字列から取得し、xml内のタグを作成し、文字列中のそれらの文字を空白で置き換えています。私は、2つのクラスを持っている以下の提供:

package x.y.z; 

import org.w3c.dom.Element; 
import org.w3c.dom.Node; 

public class ChildEle { 

public static Element getFirstChildElement(Node parent) 
{ 
    Node child = parent.getFirstChild(); 
    while (child != null) 
    { 
     if (child.getNodeType() == Node.ELEMENT_NODE) 
      return (Element)child; 
     child = child.getNextSibling(); 
    } 
    return null; 
} 
public static Node getNextSiblingElement(Node present) 
{ 
    Node node = present.getNextSibling(); 
    while (node != null && !(node instanceof Element)) 
     node = node.getNextSibling(); 
    return node; 
} 
} 

を2つ目は

package x.y.z; 

import java.io.File; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.DocumentBuilder; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 

public class FlatFileConversion { 

public static void realmethod(Node node,String sto) 
{ 
    if(node.getNodeName()=="complex") 
    { 
     Element eElement = (Element)node; 
     if(eElement.hasAttribute("count")) 
     { 
      String st=eElement.getAttribute("count"); 
      int x=Integer.parseInt(st); 
      for(int i=0;i<x;i++) 
      { 
       System.out.println("<"+node.getAttributes().getNamedItem("name").getNodeValue()+">"); 
       realmethod((Node)ChildEle.getFirstChildElement(node),sto); 
       System.out.println("</"+node.getAttributes().getNamedItem("name").getNodeValue()+">"); 
      } 
     } 
     else 
     { 
      System.out.println("<"+node.getAttributes().getNamedItem("name").getNodeValue()+">"); 
      realmethod((Node)ChildEle.getFirstChildElement(node),sto); 
      System.out.println("</"+node.getAttributes().getNamedItem("name").getNodeValue()+">"); 
     } 
    } 
    if(node.getNodeName()=="field") 
    { 
     String str2=sto.substring(0, Math.min(sto.length(),Integer.parseInt(node.getAttributes().getNamedItem("length").getNodeValue()))); 
     System.out.print("<"+node.getAttributes().getNamedItem("name").getNodeValue()+">"); 
     System.out.print(str2.trim()); 
     System.out.println("</"+node.getAttributes().getNamedItem("name").getNodeValue()+">"); 
     sto=sto.replace(str2, ""); 
     try 
     { 
      realmethod(ChildEle.getNextSiblingElement(node),sto); 
     } 
     catch(Exception e) 
     { 

     } 
    } 
} 
public static void main(String[] args) { 

    String inp="74c83tjrl1nd7jmko3hg8octgitmicte3m0eq8mzmw7zae0sqgwrj4ylzueb9lzabc3hcu78lly3nwbi18ncw1mvu039ruvz5cju2vcyeq5upzsks9rn7jz75edrh2cbcxxh758ztvpkhyjb61al5eczc57bcizfoo1dhtdljd1gfzs69tqo9vqhiqt44gmbfdq7oddjfa"; 
    try 
    { 
     File inputFile = new File("E:\\test\\input.txt"); 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(inputFile); 
     doc.getDocumentElement().normalize(); 
     realmethod((Node)doc.getDocumentElement(),inp); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 
} 

で次のように出力される。

<PARENT> 
<CHILD> 
    <GRANT-CHILD> 
     <A>74c83tj</A> 
     <B>rl1nd7jmko3</B> 
     <C>hg8octg</C> 
     <D>itmicte</D> 
     <E>3</E> 
     <F>m0eq8mzmw7zae0sqgwrj</F> 
     <G>4ylzueb9lz</G> 
     <H>abchcu78ll</H> 
     <I>ynwbi18</I> 
     <J>ncw1mvu</J> 
     <K>09ruvz5</K> 
     <L>cju2vcy</L> 
    </GRANT-CHILD> 
    <GRANT-CHILD> 
     <A>74c83tj</A> 
     <B>rl1nd7jmko3</B> 
     <C>hg8octg</C> 
     <D>itmicte</D> 
     <E>3</E> 
     <F>m0eq8mzmw7zae0sqgwrj</F> 
     <G>4ylzueb9lz</G> 
     <H>abchcu78ll</H> 
     <I>ynwbi18</I> 
     <J>ncw1mvu</J> 
     <K>09ruvz5</K> 
     <L>cju2vcy</L> 
    </GRANT-CHILD> 
</CHILD> 

倍有しGRANT-CHILDセグメント発生はまったく同じになります。 2番目のセグメントでは、私のコードは入力文字列から文字を選び、それを対応する要素ノードのテキストノードとして配置することができません。

ロジックが間違っているのを助けてください。

答えて

0

本当にあなたの質問に答えるが、あなたが同じ問題を解決しているので、知っておくと便利かもしれない...

オープン・グリッド・フォーラム上でホストされている標準は、「データ・フォーマット定義言語」があり呼ばれる(DFDL )。 https://en.wikipedia.org/wiki/Data_Format_Description_Language

をし、利用可能な独立したオープンソース実装があります:IBMは彼らの統合ソフトウェアでDFDLを実施している https://opensource.ncsa.illinois.edu/confluence/display/DFDL/Daffodil%3A+Open+Source+DFDL

DFDLは、フラット・ファイルを記述することができますが、区切りと同様のデータをタグ付きのすべての種類を扱うことができます。

関連する問題