Проверьте, является ли полученный документ XML или Edifact в пользовательском компоненте конвейера

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

Мне нравится использовать словарь, чтобы получить все свойства, используя 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());

        }

    }


}
Другие вопросы по тегам