首页 > 解决方案 > 从 XML 文档中删除根节点和第一个子节点,同时保留第二个子节点

问题描述

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

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

标签: c#xmlbiztalk

解决方案


如果您开发一个常规地图来编辑文档,您可以将其放置在接收端口的地图部分。它比管道组件更容易创建、测试和安装。

在此处输入图像描述


推荐阅读