В настоящее время я разрабатываю настраиваемый компонент конвейера для потока документов 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?