从XML文档中删除根节点和第一个子节点,同时保留第二个子节点

时间:2018-11-28 14:34:47

标签: c# xml biztalk

我目前正在为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;
        }

环顾四周,我找到了this的答案,我尝试遵循该答案,但是如上所述,它会生成一个空文档。除了简单地创建新的XDocument之外,还有其他选择吗?

1 个答案:

答案 0 :(得分:0)

如果您开发了常规地图来编辑文档,则可以将其放置在接收端口的地图部分中。创建,测试和安装比管道组件更简单。

enter image description here