1

長い話 (詳細については以下を参照) 簡単に言えば、繰り返しデータを既知の xml 形式で返すようにクエリを組み立てることができるので、特定の基準に対して各ノードと子要素が個別に返されることを誰か知っていますか?
編集:私の質問は次のように要約できると思います:重複データが次に発生するまで、繰り返しデータを照会し、エントリのグループを取得するにはどうすればよいですか?
UNB
UNH
MID
DAN
UNS
UNT
UNH
MID
DAN
UNS
UNT
UNH
MID
DAN
UNS
UNT
UNH
MID
DAN
UNS
UNT
UNH
MID
DAN
UNS
UNT
したがって、この場合、いくつかのセグメントが繰り返されることを知っているので、次のグループで UNH - UNT を返すクエリを作成するにはどうすればよいでしょうか:
UNH
MID
DAN
UNS
UNT

完全な詳細 一般的な edi (EDIFACT) を xml マッパーに書き込む必要があります。xml は構造化されており、既知であるため、xml ファイルをインポートするアプリケーションを設計し、エンティティ フレームワークを使用してファイルの構造を抽出して保存します。
ここに画像の説明を入力 Xml 構造は、Translation と呼ばれる自己参照エンティティとして格納されます。翻訳には、xml ノード、マッピング先の Edifact セグメント名、値を抽出するコンポジットと要素の位置が含まれます。翻訳は、(xml 構造を反映するために) 親/子の関連付けとして自身も参照します。UI は、各ノードのコンテンツをセグメント、コンポジット、および要素の位置に自動的に一致させます。私が抱えている問題は、繰り返しデータを適切な繰り返し親ノードに分割する方法です。 目的の XML 構造を右に、出力を左に 親なしで翻訳を抽出し、ツリーを再帰的にたどることでこれを構築しています。

var rootTrans = (from t in Translations
                    where t.ParentID==null
                    select t).ToList();
//(msg is the EDI transmission with a collection of segments-each segment contains composites, each composite contains elements with the actual data eg- )

XElement root = new XElement(Tag.Replace(" ", ""));
foreach (var item in rootTrans)
{
    item.AddContentRecursive(root, msg);
}

var doc = new XDocument(root);



// AddContentRecursive
public void AddContentRecursive(XElement element, Transmission msg)
{
    // Find matching segments for this tag
    var segNodes = (from s in msg.Segments
                        where s.Value == Name
                        select GetElementValue(s, Positions)).DefaultIfEmpty(null);
    // simply add the matching nodes to the parent element
    if (Children.Count == 0)
    {
        var nodes = (from t in segNodes
                        select new XElement(Tag, t));
        element.Add(nodes);
    }
    else
    {
        var aNode = new XElement(Tag);
        element.Add(aNode);
        foreach (var chil in Children.OrderBy(c => c.DocumentOrder))
        {
            chil.AddContentRecursive(aNode, msg);
        }
    }
}

EDI ファイルは顧客によって制御され、独自のパターンに従います。以下の例から、UNH セグメントはメッセージ ヘッダーであり、UNT まで繰り返されます。UNH の翻訳エンティティには、タグ (MessageHeader) と呼ばれるプロパティと名前 (UNH) と呼ばれるプロパティがあります。

UNH+ORDERR319952+ORDERR:1::OD'
MID+ORDERR319952+120818'
DAN+:ADVICE NOTE+TGBGU649'
MSD+CR'
SDT+0831824'
BDT+PIPUK+++++RB'
ART++46210JD000:::: :PIPE WORK,RH'
DLV++2160:45'
DTP+120823:1700'
PIN+21'
TCO+:BLB+24+90'
CSG+0831824+F01-XJ10'
UNS+S'
UNT+14+ORDERR319952'
UNH +ORDERR340246+ORDERR:1::OD'
MID+ORDERR340246+120818'
DAN+:ADVICE NOTE+RRHBU636'
MSD+CR'
SDT+0831824'
BDT+PIPUK+++++RB'
ART++46210JD005::::: PIPE WORK,LH'
DLV++2160:45'
DTP+120823:1700'
PIN+21'
TCO+:BLB+24+90'
CSG+0831824+F01-XJ10'
UNS+S'
UNT+14+ORDERR340246'
UNH+ORDERR340247+ORDERR:1::OD'
MID+ORDERR340247+120818'
DAN+:ADVICE NOTE+RRHBU641'
MSD+CR'
SDT+0831824'
BDT+PIPUK+++++ RB'
ART++46210JD600:::::PIPE WORK,RH'
DLV++4200:45'
DTP+120823:1700'
PIN+21'
TCO+:BAC4325+28+150'
CSG+0831824+F01-XJ10'
UNS +S'
UNT+14+ORDERR340247'

クエリ、再帰、ループのさまざまな組み合わせを試しましたが、基本的なものが欠けていることがわかりました。レンガの壁の領域にいます。誰もこの種の問題に遭遇しましたか? クエリを形成するための提案は、高く評価されます。ありがとう

4

1 に答える 1

0

孤独に何時間も輪になって走った後、同僚との 10 分間の議論で有効な解決策が生まれます。これは、(私が意図したようなマッピングではなく) セグメントにフローを決定させるためでした。

EDI データはシーケンシャルであり、拡張によりセグメントもシーケンシャルであるため、各セグメントをステップ実行し、その変換またはマップとペアにし、プレースホルダーを使用して XML ノードを作成およびネストするだけでした。

最もきれいではありません (同じことを行うためのより良い方法がある可能性があります) が、一貫して動作します:

// Get a collection of segments and maps
var SegsAndMaps = (from s in msg.Segments
                    join t in Maps on s.Value equals t.Name
                    orderby s.Id
                    select new { Segment = s, Map = t }).ToList();
// Set the placeholders
currentNode = null;
currentParent = null;
for (int i = 0; i < SegsAndMaps.Count; i++)
{   
    var item = SegsAndMaps[i];
    // Separate the properties from anonymous type for clarity
    var aMap = item.Map;
    var aSegment = item.Segment;
    var xml = aSegment.Xml(aMap);
    // If this map shares the same parent
    if (aMap.Parent == currentParent)
    {
        // Add the xml to the current node
        currentNode.Add(xml);
    }
    else
    {
        // Change of parent, walk up the tree to get the right parent
        var trans = aMap;
        while (currentParent != aMap.Parent)
        {
            trans = trans.Parent;
            currentParent = trans.Parent;
        }
        // Walk up the xml tree to find the parent tag to add this xml to
        currentNode = currentNode.Ancestors().DescendantsAndSelf(currentParent.Tag).FirstOrDefault();
        currentNode.Add(xml);
    }
    if (aMap.Children.Count > 0)
    {
        // If this map has child mappings, then update current parent to this, and its xml as the current node
        currentNode = xml;
        currentParent = aMap;
    }
}

var doc = new XDocument(currentNode);
于 2012-10-01T11:29:15.130 に答える