Проверьте, является ли полученный документ XML или Edifact в пользовательском компоненте конвейера - PullRequest
0 голосов
/ 20 декабря 2018

Проблема : мне нужно проверить, отформатирован ли входящий документ внутри элемента 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.Приведенный ниже код извлекает его и создает новый XDocument, который отправляется в MessageBox.

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, до его обработки?

1 Ответ

0 голосов
/ 20 декабря 2018

Мне нравится использовать словарь, чтобы получить все свойства, используя xml linq.Смотрите код ниже.Если вы получаете строковый ответ, вместо метода Load (имя файла) используйте 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());

        }

    }


}
...