c# - 从 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 之外,还有其他选择吗?
解决方案
推荐阅读
- javascript - 当我需要同时过滤多个东西时,如何调用过滤器一次?
- android - 如何为 android 应用付费和免费版本处理两种不同的功能
- c - 如何创建一个将输入除以 2 的收缩函数?
- php - PHP 从 .txt 列表中读取链接并检查它们是否已启动
- c++ - C++ to Go using SWIG:如何将 C++ 指针传递给 Go?
- ruby-on-rails - 解密 PKCS#8 Ruby OpenSSL
- java - 如何构造一个需要非常量堆的类
- anylogic - 道路交通库 - MoveTo 块 - while 循环?
- c# - 将多个 WPF 窗口作为页面添加到一个文档
- css - VueJS 中的全局样式与本地样式