Удалите корневой узел и первый дочерний элемент из документа XML, сохранив второй дочерний узел. - PullRequest
0 голосов
/ 28 ноября 2018

В настоящее время я разрабатываю настраиваемый компонент конвейера для потока документов XML, где необходимо удалить корневой узел и первый дочерний элемент этого корневого узла, оставив только второй дочерний узел (который теперь является новым корневым узлом).).

Я использую XDocument в качестве класса контейнера для документа XML.Я написал некоторый код, который получает второй дочерний узел и создает новый XML-документ с этим узлом в качестве корневого, удаляя таким образом два нежелательных узла из рисунка.

XNode secondChild = xDoc.Root.Elements().First().NextNode;
XDocument outputXml = new XDocument(new XDeclaration("1.0", "utf-8", "yes"),
                                             secondChild);

Но когда я тестирую эту настройку вBiztalk, я получаю только пустой документ в ответ.Кажется, создается пустой XML-документ, который затем возвращается.

Чтобы привести пример того, чего я хочу достичь:

Я хочу перейти от такой структуры:

<Root>
<FirstChild></FirstChild>
<SecondChild></SecondChild>
</Root>

К простой структуре, подобной этой:

<SecondChild></SecondChild>

Полный код метода Execute в конвейере:

public IBaseMessage Execute(IPipelineContext pContext, IBaseMessage pInMsg)
        {
            var originalStream = pInMsg.BodyPart.GetOriginalDataStream();
            XDocument xDoc; //new XML document to return as the message
            using (XmlReader reader = XmlReader.Create(originalStream))
            {
                reader.MoveToContent();
                xDoc = XDocument.Load(reader);
            }

            XNode secondChild = xDoc.Root.Elements().First().NextNode;
            XDocument outputXml = new XDocument(new XDeclaration("1.0", "utf-8", "yes"),
                                             secondChild);

            // Returning stream, serializing the XML to byte array
            byte[] output = System.Text.Encoding.ASCII.GetBytes(outputXml.ToString());
            MemoryStream memoryStream = new MemoryStream();
            memoryStream.Write(output, 0, output.Length);
            memoryStream.Position = 0;
            pInMsg.BodyPart.Data = memoryStream; //overwrite the original message with the modified stream

            return pInMsg;
        }

Оглядываясь на SO, я нашел этот ответ, которому я пытался следовать, нокак уже упоминалось, он создает пустой документ.Есть ли другой вариант, кроме простого создания нового XDocument?

1 Ответ

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

Если вы разрабатываете регулярную карту для редактирования документа, вы можете разместить ее в разделе карт приемного порта.Создать, протестировать и установить проще, чем конвейерный компонент.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...