ediFabric Framework v6.7.3: проблемы XML в EDI

Я пытаюсь создать файл EDI 855 с помощью класса EdiFabric.Definitions.X12_004010_855, приобретенного через EdiFabric. Я столкнулся с проблемами, пытаясь преобразовать этот объект в действительный файл EDI 855. Вот что я делаю:

Создайте новый объект M_855:

var m_855 = new M_855();

m_855.S_ST = new EdiFabric.Definitions.X12_004010_855.S_ST();
m_855.S_ST.D_329_2 = "Stuff...";
m_855.S_ST.D_143_1 = EdiFabric.Definitions.X12_004010_855.S_STD_143_1.Item855;

m_855.S_BAK = new EdiFabric.Definitions.X12_004010_855.S_BAK();

....more code, but removed for brevity...

Сериализация объекта в XML

var xml = Serialize<M_855>(m_855, "www.edifabric.com/x12")

var interchange = Interchange.LoadFrom(xml); //blows up here

public static XElement Serialize<T>(T instance, string nameSpace)
{
    // Fix: using instance.GetType() instead of typeof(T)
    var serializer = new XmlSerializer(instance.GetType(), nameSpace);
    using (var ms = new MemoryStream())
    {
        serializer.Serialize(ms, instance);
        ms.Position = 0;
        return XElement.Load(ms, LoadOptions.PreserveWhitespace);
    }
}

Что дает мне этот действительный XML:

<M_855 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="www.edifabric.com/x12">
  <S_ST>
    <D_143_1>855</D_143_1>
    <D_329_2>1126</D_329_2>
  </S_ST>
  <S_BAK>
    <D_353_1>06</D_353_1>
    <D_587_2>AD</D_587_2>
    <D_324_3>TEST3</D_324_3>
    <D_373_4>20160902</D_373_4>
  </S_BAK>
  <G_N1>
    <S_N1>
      <D_98_1>ST</D_98_1>
      <D_93_2>Name here</D_93_2>
    </S_N1>
  </G_N1>
  <G_PO1>
    <S_PO1>
      <D_350_1>001</D_350_1>
      <D_330_2>1</D_330_2>
      <D_212_4>344.35</D_212_4>
      <D_234_7>10038</D_234_7>
      <D_234_9>0135010038</D_234_9>
    </S_PO1>
    <G_ACK>
      <S_ACK>
        <D_668_1>AC</D_668_1>
      </S_ACK>
    </G_ACK>
  </G_PO1>
  <G_CTT>
    <S_CTT>
      <D_354_1>1</D_354_1>
    </S_CTT>
  </G_CTT>
  <S_SE>
    <D_96_1>6</D_96_1>
    <D_329_2>1126</D_329_2>
  </S_SE>
</M_855>

Вызовите LoadFrom () var interchange = Interchange.LoadFrom (xml)

ошибка

InnerException: {"<M_855 xmlns='www.edifabric.com/x12'> was not expected."}
Message: "There is an error in XML document (0, 0)."

Это как это должно быть сделано? Я также попытался создать новый объект Interchange() и прикрепить XML-файл как Message.Item, но получил то же сообщение об ошибке.

2 ответа

Решение

Так что после большого разочарования, я получил его на работу. Структура XML в моем исходном посте была неполной. Приведенный выше узел M_855 был лишь частью XML, который мне нужно было передать в метод Interchange.LoadFrom().

Правильная структура должна быть полной оболочкой X12, начиная с узла INTERCHANGE.

<INTERCHANGE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="www.edifabric.com/x12">
    <S_ISA>
    ...
    </S_ISA>
    <GROUPS>
        <GROUP>
            <S_GS>
            ...
            </S_GS>
            <MESSAGES>
                <MESSAGE>
                <Item>
                    <M_855>
                      ...
                    </M_855>
                </Item>
                <Context>
                    <Tag>855</Tag>
                    <Version>004010</Version>
                    <Format>X12</Format>
                </Context>
                </MESSAGE>
            </MESSAGES>
            <S_GE>
            ...
            </S_GE>
        </GROUP>
    </GROUPS>
    <S_IEA>
    ...
    </S_IEA>
</INTERCHANGE>

Так что теперь вместо сериализации объекта M_855 я делаю это:

var interchange855 = new Interchange();

interchange855.Isa = new S_ISA()
{
...
}

interchange855.Groups.Add(new Group());

interchange855.Iea = new S_IEA()
{
...
}

var edi = interchange855.ToEdi(); //works!

В этой строке: var xml = Serialize(m_855, "TestNameSpace")

пространство имен должно быть на самом деле "www.edifabric.com/x12". Не допускается сериализация в пользовательское пространство имен.

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