我目前正在为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之外,还有其他选择吗?