0

問題: XML 要素内の受信ドキュメントが XML 形式か Edifact 形式かを確認する必要があります。ドキュメントの形式に応じて、それに応じて処理する必要があります。

現在の解決策: 受信メッセージから XDocument インスタンスが作成されます。着信メッセージは常に XML です。

var originalStream = pInMsg.BodyPart.GetOriginalDataStream();
                        XDocument xDoc;
                        using (XmlReader reader = XmlReader.Create(originalStream))
                        {
                            reader.MoveToContent();
                            xDoc = XDocument.Load(reader);
                        }

この後、ドキュメントは XML 要素「msgbody」から抽出されます。現在、これは XML 形式であると想定されており、ドキュメントが Edifact 形式の場合はエラーがスローされます。以下のコードはそれを抽出し、MessageBox に送信される新しい XDocument を作成します。

string extractedDocument = xDoc.Root.Element("msgbody").Value;
extractedDocument = HttpUtility.HtmlDecode(extractedDocument);
XDocument outputXml = XDocument.Parse(extractedDocument);

Biztalk からのメッセージの例:

<NewTable>
  <conversationID>2ff845e7-30a4-482e-98d6-8c3249c5dea1</conversationID>
  <hostUTC>2018-12-17T12:17:04.107Z</hostUTC>
  <msgType>INVOIC</msgType>
  <msgid>721254</msgid>
  <icref>36655</icref>
  <msgFormat_org>EDIFACTBauhaus</msgFormat_org>
  <msgFormat>EDI</msgFormat>
  <msgbody>"Edifact or XML document"</msgbody>
  <fromID>GLN:5790034516518</fromID>
  <toID>GLN:5790000451485</toID>
</NewTable>

質問: ドキュメントを処理する前に、msgbody タグ内のドキュメントのチェックを作成して、XML 形式か Edifact 形式かを判断するにはどうすればよいですか?

4

1 に答える 1

0

辞書を使用して、xml linq を使用してすべてのプロパティを取得するのが好きです。以下のコードを参照してください。文字列の応答を取得している場合は、Load(filename) メソッドの代わりに nuse を使用して Parse(string) を使用します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication93
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {

            XDocument doc = XDocument.Load(FILENAME);
            Dictionary<string, string> dict = doc.Descendants("NewTable").Elements()
                .GroupBy(x => x.Name.LocalName, y => (string)y)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());

        }

    }


}
于 2018-12-20T11:43:58.830 に答える